home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Mousetools / PWKeys / SetPWkeys2.0.asm < prev    next >
Assembly Source File  |  1996-09-26  |  51KB  |  2,029 lines

  1. *    SetPWkeys
  2. *    1991 by Preben Nielsen
  3. *
  4. *
  5. *HISTORY
  6. *          Made with Hisoft V2.12
  7. *
  8. *  V1.0   20-Apr-91: The program has now existed for a long time, but I
  9. *                    don't remember exactly when I started on it.
  10. *  V1.1   07-May-91: Modified it to accommodate 3 new functions.
  11. *         08-May-91: Modified it to accommodate 2 new functions.
  12. *                    Added arrow-images.
  13. *         11-May-91: Located an error. The correct number of hotkeys
  14. *                    didn't get saved to file (oops).
  15. *         14-May-91: Added string-gadgets to control handler-priority and
  16. *                    mouse speed/threshold.
  17. *         15-May-91: Added string-gadgets to control screen/mouse blanking.
  18. *  V2.0   18-May-91: Now uses Workbench 2.x colors.
  19. *         19-May-91: Help, I just found out that my "TellInputDevice"
  20. *                    routine trashes memory-address 0 because it didn't
  21. *                    do a "NewList" on its Message-port. It didn't cause
  22. *                    any problems most of the time, but it has now been
  23. *                    cured.
  24.  
  25.     OPT O+
  26.     OPT O1+            ; Tells when a branch could be optimised to short
  27.     OPT i+            ; Tells when '#' is probably missing
  28.  
  29.         incdir        "AsmInc:"
  30.         include        "exec/exec_lib.i"
  31.         include        "exec/io.i"
  32.         include        "exec/memory.i"
  33.         include        "exec/interrupts.i"
  34.         include        "devices/input.i"
  35.         include        "libraries/dos_lib.i"
  36.         include        "libraries/dosextens.i"
  37.         include        "graphics/graphics_lib.i"
  38.         include        "graphics/gfxbase.i"
  39.         include        "graphics/text.i"
  40.         include        "intuition/intuition.i"
  41.         include        "intuition/intuition_lib.i"
  42.         include        "PWkeys.i"
  43.  
  44. POPSCREEN            ; If this is defined then the screen will
  45.                 ; pop up from below
  46. CUSTOMCOLORS            ; If you remove this then it uses WB-colors
  47.  
  48. PLANES            =1    ; Bitplanes on screen
  49. SWDIFF            =10    ; Difference between screen and window y-coords
  50.  
  51. FUNCTEXTS        =KeyFuncNumber+3
  52. GADTEXTS        =13
  53. MSGTEXTS        =14
  54.  
  55. TITLE            =0
  56. NOFILE            =-1
  57. READERROR        =-2
  58. WRITEERROR        =-3
  59. GOODREAD        =-4
  60. GOODWRITE        =-5
  61. NOHANDLER        =-6
  62. CANTREMOVE        =-7
  63. CANTINSTALL        =-8
  64. IMPORTOK        =-9
  65. EXPORTOK        =-10
  66. DUPLICATES        =-11
  67. WRONGPRI        =-12
  68. NOERRORS        =-13
  69.  
  70. KEYMASK            =$FF
  71.  
  72. SELECTEDBOX        =0
  73. GHOSTEDBOX        =1
  74.  
  75. Prepare        MACRO
  76.         IFC        '\1','Exec_Call'
  77.         movea.l        4.W,A6
  78.         ENDC
  79.         IFC        '\1','Intuition_Call'
  80.         movea.l        IntBase(DB),A6
  81.         ENDC
  82.         IFC        '\1','Gfx_Call'
  83.         movea.l        GraphBase(DB),A6
  84.         ENDC
  85.         IFC        '\1','Dos_Call'
  86.         movea.l        DosBase(DB),A6
  87.         ENDC
  88.         ENDM
  89. CallLib        MACRO
  90.         jsr        _LVO\1(A6)
  91.         ENDM
  92. Call        MACRO
  93.         bsr        \1
  94.         ENDM
  95. Push        MACRO        Push <reg list | all>
  96.         IFC        '\1','all'
  97.         movem.l        D0-D7/A0-A6,-(SP)
  98.         ENDC
  99.         IFNC        '\1','all'
  100.         movem.l        \1,-(SP)
  101.         ENDC
  102.         ENDM
  103. Pop        MACRO        Pop <reg list | all>
  104.         IFC        '\1','all'
  105.         movem.l        (SP)+,D0-D7/A0-A6
  106.         ENDC
  107.         IFNC        '\1','all'
  108.         movem.l        (SP)+,\1
  109.         ENDC
  110.         ENDM
  111. rAPtr        MACRO        Name
  112. DefSiz        set        DefSiz+4
  113. DefPtr        set        DefPtr-4
  114. \1        =        DefPtr
  115.         ENDM
  116. rLong        MACRO        Name
  117. DefSiz        set        DefSiz+4
  118. DefPtr        set        DefPtr-4
  119. \1        =        DefPtr
  120.         ENDM
  121. rWord        MACRO        Name
  122. DefSiz        set        DefSiz+2
  123. DefPtr        set        DefPtr-2
  124. \1        =        DefPtr
  125.         ENDM
  126. rByte        MACRO        Name
  127. DefSiz        set        DefSiz+1
  128. DefPtr        set        DefPtr-1
  129. \1        =        DefPtr
  130.         ENDM
  131. rStorage    MACRO        Name,Size    ;def storage
  132. DefSiz        set        DefSiz+\2
  133. DefPtr        set        DefPtr-\2
  134. \1        =        DefPtr
  135.         ENDM
  136. rEVEN        MACRO                ;word boundary
  137.         IFNE        DefPtr&1
  138. DefPtr        set        DefPtr-1
  139. DefSiz        set        DefSiz+1
  140.         ENDC
  141.         ENDM
  142. rStart        MACRO                ;def var section
  143. DefPtr        set        0
  144. DefSiz        set        0
  145.         ENDM
  146. rEnd        MACRO                ;def var section
  147. RelSize        =        DefSiz
  148.         ENDM
  149. rAlloc        MACRO
  150.         link        DB,#-RelSize
  151.         ENDM
  152. rFree        MACRO                ;De-allocate storage
  153.         unlk        DB
  154.         ENDM
  155. rClear        MACRO                ;reset all variables
  156.         movem.l        D0/A0,-(SP)
  157.         move.w        #RelSize-1,D0
  158.         move.l        DB,A0
  159. rClr.\@        clr.b        -(A0)
  160.         dbf        D0,rClr.\@
  161.         movem.l        (SP)+,D0/A0
  162.         ENDM
  163. Gadget        MACRO
  164.         dc.l        \1
  165.         dc.w        \2,\3,\4,\5,\6,\7,\8
  166.         ENDM
  167. Gadget2        MACRO
  168.         dc.l        \1,\2,\3,\4,\5
  169.         dc.w        \6
  170.         dc.l        \7
  171.         ENDM
  172. Border        MACRO
  173.         dc.w        \1,\2
  174.         dc.b        \3,\4,\5,\6
  175.         dc.l        \7,\8
  176.         ENDM
  177. Image        MACRO
  178.         dc.w        \1,\2,\3,\4,\5
  179.         dc.l        \6
  180.         dc.b        \7,\8
  181.         dc.l        \9
  182.         ENDM
  183. IntuiText    MACRO
  184.         dc.b        \1,\2,\3,0
  185.         dc.w        \4,\5
  186.         dc.l        TxtAttr,\6,\7
  187.         ENDM
  188. Detach        MACRO        ; Detach <'process name'>,stacksize,processpri
  189.         SECTION        MultiSplit,CODE
  190. Start        Prepare        Exec_Call
  191.         suba.l        A1,A1
  192.         CallLib        FindTask        ; Find us
  193.         move.l        D0,A0
  194.         tst.l        pr_CLI(A0)
  195.         bne.S        SegSplit
  196.         jmp        ProcessStart        ; from WorkBench
  197. SegSplit    link        A4,#-100
  198.         CallLib        Forbid            ; From Dos
  199.         lea        DName(PC),A1
  200.         CallLib        OldOpenLibrary
  201.         move.l        D0,D5
  202.         beq        6$
  203.         move.l        Start-4(PC),A1
  204.         move.l        A1,D3
  205.         moveq        #0,D6            ; Number of segments
  206.         moveq        #ML_SIZE,D7        ; Size of memory to allocate
  207.         move.l        SP,A0
  208. 1$        move.l        A1,D0            ; Count segments and make MemEntries on the stack
  209.         beq.S        2$
  210.         adda.l        A1,A1
  211.         adda.l        A1,A1
  212.         subq.l        #4,A1
  213.         move.l        A1,(A0)+        ; MemList -> ml_me[0].me_Addr    = Segment
  214.         move.l        (A1),(A0)+        ; MemList -> ml_me[0].me_Length    = Length
  215.         move.l        4(A1),A1
  216.         addq.w        #1,D6
  217.         addq.w        #ME_SIZE,D7
  218.         bra.S        1$
  219. 2$        move.l        D7,D0
  220.         move.l        #MEMF_PUBLIC|MEMF_CLEAR,D1
  221.         CallLib        AllocMem        ; Allocate Memlist
  222.         move.l        D0,A2
  223.         tst.l        D0
  224.         beq.S        5$
  225.         move.w        D6,ML_NUMENTRIES(A2)    ; MemList -> ml_NumEntries = number of segments
  226.         move.l        SP,A0
  227.         lea        ML_ME(A2),A1
  228.         move.l        D7,D0
  229.         sub.w        #ML_SIZE+1,D0
  230. 3$        move.b        (A0)+,(A1)+
  231.         dbf        D0,3$
  232.         move.l        #ProcessName,D1
  233.         moveq        #\3,D2            ; Priority
  234.         move.l        #\2,D4            ; Stacksize
  235.         move.l        D5,A6
  236.         CallLib        CreateProc
  237.         Prepare        Exec_Call
  238.         move.l        D0,A0
  239.         tst.l        D0
  240.         beq.S        4$
  241.         lea        -pr_MsgPort(A0),A0    ; Now we have process
  242.         not.l        pr_CLI(A0)        ; All MY programs will now think they were started from the CLI
  243.         lea        TC_MEMENTRY(A0),A0
  244.         move.l        A2,A1
  245.         CallLib        AddTail            ; AddTail(&Process->pr_Task.tc_MemEntry,&MemList->ml_Node);
  246.         lea        Start-4(PC),A1
  247.         clr.l        (A1)            ; Split the segments
  248.         bra.S        5$
  249. 4$        move.l        A2,A1            ; CreateProc failed. Can't do anything then
  250.         move.l        D7,D0
  251.         CallLib        FreeMem
  252. 5$        move.l        D5,A1
  253.         CallLib        CloseLibrary
  254. 6$        CallLib        Permit
  255.         unlk        A4
  256.         moveq        #0,D0
  257.         rts
  258. DName        dc.b        'dos.library',0
  259. ProcessName    dc.b        \1,0            ; CreateProc makes a copy of this name
  260.         SECTION        ProcessCode,CODE
  261. ProcessStart
  262.         ENDM
  263.  
  264. DB        EQUR        A4
  265.  
  266. InitProcess    Detach        <'SetPWkeys Process'>,4000,0
  267.         rAlloc                    ; Allocate memory for variables
  268.         rClear                    ; Clear the memory
  269.         Prepare        Exec_Call
  270.         suba.l        A1,A1
  271.         CallLib        FindTask        ; Find us
  272.         move.l        D0,PProcess(DB)
  273.         movea.l        D0,A2
  274.         tst.l        pr_CLI(A2)
  275.         bne.S        GetLibs
  276. WBenchStartup    lea        pr_MsgPort(A2),A0
  277.         CallLib        WaitPort        ; wait for a message
  278.         lea        pr_MsgPort(A2),A0
  279.         CallLib        GetMsg            ; then get it
  280.         move.l        D0,WBenchMsg(DB)    ; save it for later reply
  281. GetLibs        lea        DosName(PC),A1
  282.         CallLib        OldOpenLibrary
  283.         move.l        D0,DosBase(DB)
  284.         beq        Error
  285.         lea        GfxName(PC),A1
  286.         CallLib        OldOpenLibrary
  287.         move.l        D0,GraphBase(DB)
  288.         beq.S        Error
  289.         lea        IntName(PC),A1
  290.         CallLib        OldOpenLibrary
  291.         move.l        D0,IntBase(DB)
  292.         beq.S        Error
  293.         Prepare        Intuition_Call
  294.         lea        NewS(PC),A0
  295.     IFD POPSCREEN
  296.         move.l        GraphBase(DB),A1
  297.         move.w        gb_NormalDisplayRows(A1),ns_TopEdge(A0)
  298.         ori.w        #SCREENBEHIND,ns_Type(A0)
  299.     ENDC
  300.         CallLib        OpenScreen
  301.         move.l        D0,DScreen(DB)
  302.         beq.S        Error
  303.         moveq        #sc_ViewPort,D1
  304.         add.l        D0,D1
  305.         move.l        D1,ScrVp(DB)
  306.         moveq        #sc_RastPort,D1
  307.         add.l        D0,D1
  308.         move.l        D1,Rp(DB)
  309.  
  310.     IFD CUSTOMCOLORS
  311.         Prepare        Gfx_Call
  312.         move.l        ScrVp(DB),A0
  313.         lea        ColorTable(PC),A1
  314.         moveq        #2,D0
  315.         CallLib        LoadRGB4
  316.     ENDC
  317.         Prepare        Intuition_Call
  318.         lea        NewW(PC),A0
  319.         move.l        DScreen(DB),nw_Screen(A0)
  320.         CallLib        OpenWindow
  321.         move.l        D0,DWindow(DB)
  322.         movea.l        D0,A0
  323.         beq.S        Error
  324.         move.l        wd_UserPort(A0),Up(DB)
  325.         Call        SetAPen1
  326.         bra.S        Main
  327.  
  328. Exit
  329. Error
  330. FreeWindow    Prepare        Intuition_Call
  331.         move.l        DWindow(DB),D0
  332.         beq.S        FreeScreen
  333.     IFD POPSCREEN
  334.         Call        PushScreen
  335.     ENDC
  336.         move.l        DWindow(DB),A0
  337.         CallLib        CloseWindow
  338. FreeScreen    move.l        DScreen(DB),D0
  339.         beq.S        FreeIntuition
  340.         movea.l        D0,A0
  341.         CallLib        CloseScreen
  342. FreeIntuition    Prepare        Exec_Call
  343.         move.l        IntBase(DB),D0
  344.         beq.S        FreeGraphics
  345.         movea.l        D0,A1
  346.         CallLib        CloseLibrary
  347. FreeGraphics    move.l        GraphBase(DB),D0
  348.         beq.S        FreeDos
  349.         movea.l        D0,A1
  350.         CallLib        CloseLibrary
  351. FreeDos        move.l        DosBase(DB),D0
  352.         beq.S        ReplyWB
  353.         movea.l        D0,A1
  354.         CallLib        CloseLibrary
  355. ReplyWB        move.l        WBenchMsg(DB),D2
  356.         beq.S        AllDone
  357.         CallLib        Forbid
  358.         movea.l        D2,A1
  359.         CallLib        ReplyMsg        ; Reply WBenchMessage if we are started from WB
  360. AllDone        rFree
  361.         moveq        #0,D0
  362.         rts
  363.  
  364. Main        Prepare        Intuition_Call
  365.  
  366.         move.w        #FFx1+74,D0
  367.         moveq        #FFy1+13,D1
  368.         move.l        Rp(DB),A0
  369.         lea        UArrowImage(PC),A1
  370.         CallLib        DrawImage
  371.  
  372.         moveq        #FFx1,D0
  373.         moveq        #FFy1,D1
  374.         move.l        Rp(DB),A0
  375.         lea        WFuncBorder(PC),A1
  376.         CallLib        DrawBorder
  377.         move.w        #FFx2,D0
  378.         moveq        #FFy2,D1
  379.         move.l        Rp(DB),A0
  380.         lea        SFuncBorder(PC),A1
  381.         CallLib        DrawBorder
  382.         move.w        #FFx3,D0
  383.         moveq        #FFy3,D1
  384.         move.l        Rp(DB),A0
  385.         lea        MFuncBorder(PC),A1
  386.         CallLib        DrawBorder
  387.  
  388.         moveq        #0,D0
  389.         moveq        #KY-5,D1
  390.         move.l        Rp(DB),A0
  391.         lea        KeybBorder(PC),A1
  392.         CallLib        DrawBorder
  393.         moveq        #TITLE,D0
  394.         Call        WriteMsg
  395.         Call        WriteTexts
  396.         Call        DrawKeys
  397.         Call        SetAPen0
  398.         lea        ReturnKey2(PC),A2
  399.         move.w        Box_x(A2),D2
  400.         add.w        Box_Width(A2),D2
  401.         move.w        Box_y(A2),D3
  402.         move.w        D2,D0
  403.         move.w        D3,D1
  404.         move.l        Rp(DB),A1
  405.         CallLib        Move
  406.         move.w        D2,D0
  407.         move.w        D3,D1
  408.         subq.w        #1,D1
  409.         add.w        Box_Height(A2),D1
  410.         move.l        Rp(DB),A1
  411.         CallLib        Draw
  412.         subq.w        #1,D2
  413.         move.w        D2,D0
  414.         move.w        D3,D1
  415.         addq.w        #1,D1
  416.         move.l        Rp(DB),A1
  417.         CallLib        Move
  418.         move.w        D2,D0
  419.         move.w        D3,D1
  420.         add.w        Box_Height(A2),D1
  421.         subq.w        #1,D1
  422.         move.l        Rp(DB),A1
  423.         CallLib        Draw
  424.         Call        SetAPen1
  425.  
  426.         Call        DoImport
  427.         cmp.w        #IMPORTOK,D0        ; Did we find handler ?
  428.         beq.S        1$
  429.  
  430.         Call        ClearFunctions        ; No we didn't !
  431.         Call        ClearKeyboard
  432.         Call        SetStrings
  433.         lea        Funcs(PC),A0
  434.         bset        #SELECTEDBOX,Box_Flags(A0)
  435.         move.l        A0,CurFunc(DB)
  436.         Call        FillKeyboard
  437.         Call        FillFunctions
  438. 1$
  439.     IFD POPSCREEN
  440.         Call        PopScreen        ; Bring screen up
  441.     ENDC
  442. EventLoop    tst.w        Quit(DB)
  443.         bne        Exit
  444.         movea.l        Up(DB),A0
  445.         Prepare        Exec_Call
  446.         CallLib        WaitPort
  447. GetNextMsg    Call        GetAMessage
  448.         beq.S        EventLoop
  449.         move.l        Class(DB),D0
  450.         cmpi.w        #GADGETUP,D0
  451.         beq.S        DoGadget
  452.         cmpi.w        #GADGETDOWN,D0
  453.         beq.S        DoGadget
  454.         cmpi.w        #MOUSEBUTTONS,D0
  455.         beq        DoMouse
  456.         bra.S        GetNextMsg
  457.  
  458.     IFD POPSCREEN
  459. MOVESTEP    =10
  460. PopScreen    Prepare        Intuition_Call
  461.         move.l        DScreen(DB),A0
  462.         CallLib        ScreenToFront
  463.         moveq        #-MOVESTEP,D2
  464.         move.l        DScreen(DB),A0
  465.         move.w        sc_TopEdge(A0),D1
  466.         Call        PScreen
  467.         rts
  468.  
  469. PushScreen    moveq        #MOVESTEP,D2
  470.         move.l        GraphBase(DB),A0
  471.         move.w        gb_NormalDisplayRows(A0),D1
  472.         move.l        DScreen(DB),A0
  473.         sub.w        sc_TopEdge(A0),D1
  474.         Prepare        Intuition_Call
  475.         Call        PScreen
  476.         move.l        DScreen(DB),A0
  477.         CallLib        ScreenToBack
  478.         rts
  479.  
  480. * Call: D1 = y-coordinates to move screen
  481. *       D2 = delta-y
  482. PScreen        ext.l        D1
  483.         move.w        D1,D3
  484.         divu        #MOVESTEP,D1
  485.         swap        D1
  486.         sub.w        D1,D3
  487.         tst.w        D2
  488.         bpl.S        1$
  489.         neg.w        D1
  490. 1$        tst.w        D1
  491.         beq.S        4$
  492.         bra.S        3$
  493. 2$        move.w        D2,D1
  494. 3$        moveq        #0,D0
  495.         move.l        DScreen(DB),A0
  496.         CallLib        MoveScreen
  497. 4$        sub.w        #MOVESTEP,D3
  498.         bge.S        2$
  499.         rts
  500.     ENDC
  501.  
  502. * A gadget was selected
  503. DoGadget
  504. GJ        movea.l        IAddress(DB),A1
  505.         move.w        gg_GadgetID(A1),D0    ; GadgetID is offset from GJ
  506.         jsr        GJ(PC,D0.W)
  507.         bra        GetNextMsg
  508.  
  509.  
  510. * User clicked the 'Check' gadget
  511. DoCheck        move.l        CurFunc(DB),A0
  512.         Call        KeysToFunc
  513.         Call        SortKeys
  514.         moveq        #DUPLICATES,D7
  515.         Call        FindDuplicates
  516.         bge.S        1$
  517.         Call        GetStrings
  518.         move.l        D0,D7
  519.         bmi.S        1$
  520.         moveq        #NOERRORS,D7
  521. 1$        move.l        D7,D0
  522.         Call        WriteMsg
  523. DoGadgets    rts
  524.  
  525. DoQuit        not.w        Quit(DB)
  526.         rts
  527.  
  528. * User clicked the 'Import' gadget
  529. * Returns error-code in D0 !!!
  530. DoImport    Prepare        Exec_Call
  531.         CallLib        Forbid
  532.         lea        PWkeysPortName(PC),A1
  533.         CallLib        FindPort
  534.         move.l        D0,D2
  535.         CallLib        Permit
  536.         moveq        #NOHANDLER,D7
  537.         tst.l        D2
  538.         beq.S        1$
  539.         move.l        D0,A0            ; Handler was installed
  540.         move.l        ihs_Interrupt+IS_DATA(A0),A0
  541.         lea        TBuf(DB),A1
  542.         move.w        #pw_SIZE,D0        ; Copy keydefinition from the
  543.         Call        MemCopy            ; handlers memory
  544.         clr.l        pw_MWaitTime(A1)
  545.         clr.l        pw_SWaitTime(A1)
  546.         Call        ClearFunctions
  547.         Call        ClearKeyboard
  548.         Call        UnsortKeys
  549.         Call        InitFuncs
  550.         Call        SetStrings
  551.         lea        Funcs(PC),A0
  552.         bset        #SELECTEDBOX,Box_Flags(A0)
  553.         move.l        A0,CurFunc(DB)
  554.         Call        FillKeyboard
  555.         Call        FillFunctions
  556.         moveq        #IMPORTOK,D7
  557. 1$        move.l        D7,D0
  558.         Call        WriteMsg
  559.         rts
  560.  
  561. * User clicked the 'Export' gadget
  562. DoExport    move.l        CurFunc(DB),A0
  563.         Call        KeysToFunc
  564.         Call        SortKeys
  565.         moveq        #DUPLICATES,D7
  566.         Call        FindDuplicates
  567.         bge.S        2$
  568.         Call        MakeMasks
  569.         Call        CountKeys
  570.         Call        GetStrings
  571.         move.l        D0,D7
  572.         bmi.S        2$
  573.         Prepare        Exec_Call
  574.         CallLib        Forbid
  575.         lea        PWkeysPortName(PC),A1
  576.         CallLib        FindPort
  577.         move.l        D0,D2
  578.         CallLib        Permit
  579.         moveq        #NOHANDLER,D7
  580.         tst.l        D2
  581.         beq.S        2$
  582.         move.l        D2,A2
  583.         move.l        A2,A0
  584.         moveq        #IND_REMHANDLER,D0
  585.         moveq        #CANTREMOVE,D7
  586.         Call        TellInputDevice
  587.         bne.S        2$
  588.         lea        TBuf(DB),A0
  589.         move.b        pw_Pri(A0),ihs_Interrupt+LN_PRI(A2)    ; HandlerBlock.HInterrupt.is_Node.ln_Pri = PRI;
  590.         move.l        ihs_Interrupt+IS_DATA(A2),A1
  591.         move.w        #pw_SIZE,D0        ; Copy keydefinition into the
  592.         Call        MemCopy            ; PWkeys-handler memory
  593.         move.l        A2,A0
  594.         moveq        #IND_ADDHANDLER,D0
  595.         moveq        #EXPORTOK,D7
  596.         Call        TellInputDevice
  597.         beq.S        2$
  598.         Prepare        Exec_Call
  599.         move.l        ihs_MemEntry(A2),A0
  600.         CallLib        FreeEntry
  601.         moveq        #CANTINSTALL,D7
  602. 2$        move.l        D7,D0
  603.         Call        WriteMsg
  604.         rts
  605.  
  606. * User clicked the 'Undo' gadget
  607. DoUndo        Call        ClearKeyboard
  608.         move.l        CurFunc(DB),A0
  609.         Call        FillKeyboard
  610.         rts
  611.  
  612. * User clicked the 'Clear' gadget
  613. DoClear        Call        ClearKeyboard
  614.         rts
  615.  
  616. * User clicked the 'Save' gadget
  617. DoSave        move.l        CurFunc(DB),A0
  618.         Call        KeysToFunc
  619.         Call        SortKeys
  620.         moveq        #DUPLICATES,D7
  621.         Call        FindDuplicates
  622.         bge.S        2$
  623.         Call        MakeMasks
  624.         Call        CountKeys
  625.         Call        GetStrings
  626.         move.l        D0,D7
  627.         bmi.S        2$
  628.         Prepare        Dos_Call
  629.         lea        FBuffer(PC),A0
  630.         move.l        A0,D1
  631.         move.l        #MODE_NEWFILE,D2
  632.         moveq        #NOFILE,D7
  633.         CallLib        Open
  634.         move.l        D0,FHandle(DB)
  635.         beq.S        1$
  636.         move.l        D0,D1
  637.         lea        TBuf(DB),A0
  638.         move.l        A0,D2
  639.         move.l        #pw_SIZE,D3
  640.         moveq        #WRITEERROR,D7
  641.         CallLib        Write
  642.         cmp.l        D0,D3
  643.         bne.S        1$
  644.         moveq        #GOODWRITE,D7
  645. 1$        move.l        FHandle(DB),D1
  646.         beq.S        2$
  647.         CallLib        Close
  648. 2$        move.l        D7,D0
  649.         Call        WriteMsg
  650.         rts
  651.  
  652. * User clicked the 'Load' gadget
  653. DoLoad        Prepare        Dos_Call
  654.         lea        FBuffer(PC),A0
  655.         move.l        A0,D1
  656.         move.l        #MODE_OLDFILE,D2
  657.         moveq        #NOFILE,D7
  658.         CallLib        Open
  659.         move.l        D0,FHandle(DB)
  660.         beq.S        1$
  661.         move.l        D0,D1
  662.         lea        TBuf(DB),A0
  663.         move.l        A0,D2
  664.         move.l        #pw_SIZE,D3
  665.         moveq        #READERROR,D7
  666.         CallLib        Read
  667.         cmp.l        D0,D3
  668.         bne.S        1$
  669.         lea        TBuf(DB),A0
  670.         movem.l        (A0),D0-D1
  671.         movem.l        PWkVersionID(PC),D2-D3
  672.         cmp.l        D0,D2
  673.         bne.S        1$
  674.         cmp.l        D1,D3
  675.         bne.S        1$
  676.         Call        ClearFunctions
  677.         Call        ClearKeyboard
  678.         Call        UnsortKeys
  679.         Call        InitFuncs
  680.         Call        SetStrings
  681.         lea        Funcs(PC),A0
  682.         bset        #SELECTEDBOX,Box_Flags(A0)
  683.         move.l        A0,CurFunc(DB)
  684.         Call        FillKeyboard
  685.         Call        FillFunctions
  686.         moveq        #GOODREAD,D7
  687. 1$        move.l        FHandle(DB),D1
  688.         beq.S        2$
  689.         CallLib        Close
  690. 2$        move.l        D7,D0
  691.         Call        WriteMsg
  692.         rts
  693.  
  694. * The user pressed/released a mousebutton
  695. DoMouse        cmpi.w        #SELECTDOWN,Code(DB)
  696.         bne        DoM
  697.         move.w        Qual(DB),D0
  698.         andi.w        #SHIFT,D0
  699.         beq.S        DoLB
  700. * Perhaps the user clicked on a qualifier-key with RMB
  701. DoRB        cmp.w        #KY-SWDIFF,MouseY(DB)
  702.         blt        DoSelFunc
  703.         Call        WhichKey
  704.         bmi        DoM
  705.         tst.w        KeyBox_Qual(A0)        ; Is it a qual-key ?
  706.         beq        DoM
  707.         btst        #SELECTEDBOX,Box_Flags(A0)
  708.         beq.S        1$
  709.         btst        #GHOSTEDBOX,Box_Flags(A0)
  710.         bne.S        1$
  711.         Call        RawInvert        ; Key was raw
  712.         move.l        #-1,CurCode(DB)
  713. 1$        Call        QualInvert
  714.         bra        DoM
  715. * Perhaps the user clicked on a key with LMB
  716. DoLB        cmp.w        #KY-SWDIFF,MouseY(DB)
  717.         blt.S        DoSelFunc
  718.         Call        WhichKey
  719.         bmi        DoM
  720.         move.l        CurCode(DB),D0
  721.         move.l        A0,CurCode(DB)
  722.         tst.l        D0
  723.         bmi.S        5$
  724.         lea        ReturnKey1(PC),A1    ; Treat the two
  725.         lea        ReturnKey2(PC),A2    ; parts of the
  726.         cmp.l        A1,A0            ; RETURN-key as
  727.         beq.S        1$            ; if they were
  728.         cmp.l        A2,A0            ; one
  729.         bne.S        3$
  730. 1$        cmp.l        A1,D0
  731.         beq.S        2$
  732.         cmp.l        A2,D0
  733.         bne.S        3$
  734. 2$        move.l        A0,D0
  735.  
  736. 3$        cmp.l        A0,D0
  737.         beq.S        4$
  738.         move.l        D0,A0            ; Changed key
  739.         Call        RawInvert
  740.         move.l        CurCode(DB),A0
  741.         bra.S        5$
  742. 4$        move.l        #-1,CurCode(DB)        ; Unselected a key
  743. 5$        btst        #SELECTEDBOX,Box_Flags(A0)
  744.         beq.S        6$
  745.         btst        #GHOSTEDBOX,Box_Flags(A0)
  746.         beq.S        6$
  747.         Call        QualInvert        ; Key was qual
  748. 6$        Call        RawInvert
  749.         bra.S        DoM
  750. * Perhaps the user clicked on a function
  751. DoSelFunc    Call        WhichFunc
  752.         bmi.S        DoM
  753.         move.l        CurFunc(DB),A1
  754.         cmp.l        A0,A1            ; If the function is already selected
  755.         beq.S        1$            ; then this is click is a 'UNDO' click
  756.         move.l        A0,CurFunc(DB)
  757.         move.l        A1,A0
  758.         Call        KeysToFunc        ; Save the selected keys
  759.         btst        #GHOSTEDBOX,Box_Flags(A0)
  760.         beq.S        3$
  761.         Call        RawInvert
  762.         Call        QualInvert
  763.         bset        #GHOSTEDBOX,Box_Flags(A0)
  764.         bra.S        4$
  765. 3$        Call        RawInvert        ; Unselect function
  766. 4$        move.l        CurFunc(DB),A0
  767.         btst        #GHOSTEDBOX,Box_Flags(A0)
  768.         beq.S        2$
  769.         Call        QualInvert
  770. 2$        Call        RawInvert        ; Select function
  771. 1$        Call        ClearKeyboard
  772.         move.l        CurFunc(DB),A0
  773.         Call        FillKeyboard
  774. DoM        bra        GetNextMsg
  775.  
  776. * THE INVERT FUNCTONS ONLY PRESERVES A0
  777. * Complements a key with a pattern
  778. * Call: A0 = box
  779. QualInvert    Push        A0
  780.         bchg        #GHOSTEDBOX,Box_Flags(A0)
  781.         movea.l        Rp(DB),A1
  782.         move.l        #Mask,rp_AreaPtrn(A1)
  783.         move.b        #2,rp_AreaPtSz(A1)
  784.         bra.S        RI2
  785. * Complements a key
  786. * Call: A0 = box
  787. RawInvert    cmp.l        #ReturnKey1,A0
  788.         beq.S        1$
  789.         cmp.l        #ReturnKey2,A0
  790.         bne.S        RI
  791. 1$        Push        A0
  792.         lea        ReturnKey1(PC),A0
  793.         Call        RI
  794.         lea        ReturnKey2(PC),A0
  795.         Call        RI
  796.         Pop        A0
  797.         rts
  798. RI        Push        A0
  799. RI2        bchg        #SELECTEDBOX,Box_Flags(A0)
  800.         move.l        A0,A2
  801.         Prepare        Gfx_Call
  802.         Call        SetDrMd2
  803.         move.w        Box_x(A2),D0
  804.         move.w        Box_y(A2),D1
  805.         move.w        D0,D2
  806.         move.w        D1,D3
  807.         addq.w        #1,D0
  808.         addq.w        #1,D1
  809.         add.w        Box_Width(A2),D2
  810.         add.w        Box_Height(A2),D3
  811.         subq.w        #1,D2
  812.         subq.w        #1,D3
  813.         movea.l        Rp(DB),A1
  814.         CallLib        RectFill
  815.         Call        SetDrMd1
  816.         movea.l        Rp(DB),A1
  817.         clr.l        rp_AreaPtrn(A1)
  818.         clr.b        rp_AreaPtSz(A1)
  819.         Pop        A0
  820.         rts
  821.  
  822. * Finds the selected function box (if any)
  823. * Return: If D0=-1 then couldn't find anything, else A0=FuncBox
  824. WhichFunc    lea        Funcs(PC),A0
  825.         bra.S        WFK
  826. * Finds the selected key (if any)
  827. * Return: If D0=-1 then couldn't find anything, else A0=KeyBox
  828. WhichKey    lea        Keys(PC),A0
  829. WFK        move.w        MouseX(DB),D6
  830.         move.w        MouseY(DB),D7
  831.         add.w        #SWDIFF,D7
  832. 1$        move.w        Box_y(A0),D1
  833.         bmi.S        3$
  834.         cmp.w        D1,D7
  835.         blt.S        2$
  836.         add.w        Box_Height(A0),D1
  837.         cmp.w        D1,D7
  838.         bgt.S        2$
  839.         move.w        Box_x(A0),D0
  840.         cmp.w        D0,D6
  841.         blt.S        2$
  842.         add.w        Box_Width(A0),D0
  843.         cmp.w        D0,D6
  844.         bgt.S        2$
  845.         moveq        #0,D0
  846.         bra.S        4$
  847. 2$        add.l        #FKeyBox_SIZE,A0
  848.         bra.S        1$
  849. 3$        moveq        #-1,D0
  850. 4$        rts
  851.  
  852. * Draw all the keys
  853. DrawKeys    lea        Keys(PC),A2
  854. DL        Prepare        Gfx_Call
  855. 1$        move.w        Box_x(A2),D0
  856.         bmi        3$
  857.         move.w        Box_y(A2),D1
  858.         move.l        Rp(DB),A1
  859.         CallLib        Move
  860.         move.w        Box_x(A2),D0
  861.         move.w        Box_y(A2),D1
  862.         add.w        Box_Width(A2),D0
  863.         move.l        Rp(DB),A1
  864.         CallLib        Draw
  865.         move.w        Box_x(A2),D0
  866.         move.w        Box_y(A2),D1
  867.         add.w        Box_Width(A2),D0
  868.         add.w        Box_Height(A2),D1
  869.         move.l        Rp(DB),A1
  870.         CallLib        Draw
  871.         move.w        Box_x(A2),D0
  872.         move.w        Box_y(A2),D1
  873.         add.w        Box_Height(A2),D1
  874.         move.l        Rp(DB),A1
  875.         CallLib        Draw
  876.         move.w        Box_x(A2),D0
  877.         move.w        Box_y(A2),D1
  878.         move.l        Rp(DB),A1
  879.         CallLib        Draw
  880.         lea        StrBuf(PC),A0
  881.         move.b        KeyBox_Char(A2),(A0)
  882.         beq.S        2$
  883.         move.w        Box_x(A2),D0
  884.         addq.w        #7,D0
  885.         move.w        Box_y(A2),D1
  886.         addq.w        #8,D1
  887.         move.l        Rp(DB),A1
  888.         CallLib        Move
  889.         lea        StrBuf(PC),A0
  890.         moveq        #1,D0
  891.         move.l        Rp(DB),A1
  892.         CallLib        Text
  893. 2$        add.l        #FKeyBox_SIZE,A2
  894.         bra        1$
  895. 3$        rts
  896.  
  897. * Call: A0 = FuncBox
  898. FillFunctions    Call        KeysToFunc
  899.         Push        A2
  900.         lea        Funcs(PC),A2
  901.         bclr        #GHOSTEDBOX,Box_Flags(A2)    ;Just loaded new file, first item needs to be selected
  902.         Pop        A2
  903. * hilites/unhilites all functions with the 'SELECTEDBOX/GHOSTEDBOX' flag set
  904. RefreshFunc    Push        D0-D3/A0-A2/A6
  905.         lea        Funcs(PC),A2
  906.         bra.S        RFK
  907. * Call: A0 = FuncBox
  908. FillKeyboard    Call        FuncToKeys
  909. * hilites/unhilites all keys with the 'SELECTEDBOX'/'GHOSTEDBOX' flag set
  910. RefreshKeys    Push        D0-D3/A0-A2/A6
  911.         lea        Keys(PC),A2
  912. RFK
  913. 1$        move.w        Box_x(A2),D0
  914.         bmi.S        5$
  915.         btst        #SELECTEDBOX,Box_Flags(A2)
  916.         beq.S        4$
  917.         move.l        A2,A0
  918.         btst        #GHOSTEDBOX,Box_Flags(A2)
  919.         beq.S        2$
  920.         Call        QualInvert
  921.         bset        #GHOSTEDBOX,Box_Flags(A2)
  922.         bra.S        3$
  923. 2$        Call        RawInvert
  924. 3$        bset        #SELECTEDBOX,Box_Flags(A2)
  925. 4$        add.l        #FKeyBox_SIZE,A2
  926.         bra.S        1$
  927. 5$        Pop        D0-D3/A0-A2/A6
  928.         rts
  929.  
  930. * Clears all hilite-flags in the 'Funcs' array
  931. ClearFunctions    move.l        CurFunc(DB),A0        ; This is because the selected
  932.         bclr        #GHOSTEDBOX,Box_Flags(A0); can be both selected and ghosted
  933.         Call        RefreshFunc
  934.         Push        A2
  935.         lea        Funcs(PC),A2
  936.         bra.S        CFK
  937. * Clears all hilite-flags in the 'Keys' array
  938. ClearKeyboard    Call        RefreshKeys
  939.         move.l        #-1,CurCode(DB)
  940.         Push        A2
  941.         lea        Keys(PC),A2
  942. CFK    * Clears all hilite-flags in the 'Keys/Funcs' array
  943. 1$        tst.w        Box_x(A2)
  944.         bmi.S        2$
  945.         bclr        #SELECTEDBOX,Box_Flags(A2)
  946.         bclr        #GHOSTEDBOX,Box_Flags(A2)
  947.         add.l        #FKeyBox_SIZE,A2
  948.         bra.S        1$
  949. 2$        Pop        A2
  950.         rts
  951.  
  952. * Call: A0 = FuncBox
  953. * Collects all hilite-flags in the 'Keys' array
  954. KeysToFunc    Push        D0-D2/A0-A2
  955.         move.l        FuncBox_HotKey(A0),A1
  956.         move.w        #U_CODE,D1
  957.         moveq        #0,D2
  958.         lea        Keys(PC),A2
  959. 1$        move.w        Box_x(A2),D0
  960.         bmi.S        4$
  961.         btst        #SELECTEDBOX,Box_Flags(A2)
  962.         beq.S        3$
  963.         btst        #GHOSTEDBOX,Box_Flags(A2)
  964.         bne.S        2$
  965.         move.w        KeyBox_Code(A2),D1
  966.         bra.S        3$
  967. 2$        or.w        KeyBox_Qual(A2),D2
  968. 3$        add.l        #FKeyBox_SIZE,A2
  969.         bra.S        1$
  970. 4$        cmp.w        #U_CODE,D1
  971.         bne.S        5$
  972.         bset        #GHOSTEDBOX,Box_Flags(A0)    ; If no code then function has to be ghosted
  973.         moveq        #U_QUAL,D2            ; If no code then no qualifier
  974. 5$        move.w        D1,HotKey_Code(A1)
  975.         move.w        D2,HotKey_Qual(A1)
  976.         Pop        D0-D2/A0-A2
  977.         rts
  978.  
  979. * Call: A0 = FuncBox
  980. * Set all hilite-flags in the 'Keys' array
  981. FuncToKeys    Push        D0/A0/A2
  982.         move.l        FuncBox_HotKey(A0),A0
  983.         lea        Keys(PC),A2
  984. 1$        move.w        Box_x(A2),D0
  985.         bmi.S        4$
  986.         move.w        KeyBox_Code(A2),D0
  987.         cmp.w        HotKey_Code(A0),D0
  988.         bne.S        2$
  989.         move.l        A2,CurCode(DB)
  990.         bset        #SELECTEDBOX,Box_Flags(A2)
  991.         bra.S        3$
  992. 2$        move.w        KeyBox_Qual(A2),D0
  993.         and.w        HotKey_Qual(A0),D0
  994.         beq.S        3$
  995.         bset        #SELECTEDBOX,Box_Flags(A2)
  996.         bset        #GHOSTEDBOX,Box_Flags(A2)
  997. 3$        add.l        #FKeyBox_SIZE,A2
  998.         bra.S        1$
  999. 4$        Pop        D0/A0/A2
  1000.         rts
  1001.  
  1002. * Makes some masks
  1003. MakeMasks    Push        D0-D4/A0-A2
  1004.         lea        TBuf+pw_KeyDefs(DB),A2
  1005.         moveq        #0,D0
  1006.         moveq        #-2,D2            ; Code
  1007. ml        cmp.w        #KeyFuncNumber,D0
  1008.         bge.S        5$
  1009.         moveq        #0,D1            ; Number
  1010.         moveq        #0,D3            ; Qual
  1011. 1$        move.l        D0,D4            ; 'OR' qualifiers for all hotkeys with this code
  1012.         add.w        D1,D4
  1013.         cmp.w        #KeyFuncNumber,D4
  1014.         bge.S        2$
  1015.         mulu        #HotKey_SIZE,D4
  1016.         lea        0(A2,D4),A0
  1017.         cmp.w        HotKey_Code(A0),D2
  1018.         bne.S        2$
  1019.         addq.l        #1,D1
  1020.         or.w        HotKey_Qual(A0),D3
  1021.         bra.S        1$
  1022. 2$        tst.w        D3
  1023.         bne.S        4$
  1024.         move.w        #KEYMASK,D3
  1025.         bra.S        4$
  1026. 3$        move.l        D0,D4            ;Store the 'OR'ed qualifiers in all hotkeys with this code
  1027.         mulu        #HotKey_SIZE,D4
  1028.         lea        0(A2,D4),A1
  1029.         move.w        D3,HotKey_QMask(A1)
  1030.         addq.l        #1,D0
  1031. 4$        dbf        D1,3$
  1032.         move.w        HotKey_Code(A0),D2
  1033.         bra.S        ml
  1034. 5$        Pop        D0-D4/A0-A2
  1035.         rts
  1036.  
  1037. InitFuncs    Push        D0/A0-A2
  1038.         lea        Funcs(PC),A2
  1039. 1$        move.w        Box_x(A2),D0
  1040.         bmi.S        2$
  1041.         move.l        FuncBox_HotKey(A2),A0
  1042.         bclr        #SELECTEDBOX,Box_Flags(A2)
  1043.         bclr        #GHOSTEDBOX,Box_Flags(A2)
  1044.         cmp.w        #U_CODE,HotKey_Code(A0)
  1045.         bne.S        3$
  1046.         bset        #SELECTEDBOX,Box_Flags(A2)
  1047.         bset        #GHOSTEDBOX,Box_Flags(A2)
  1048. 3$        add.l        #FKeyBox_SIZE,A2
  1049.         bra.S        1$
  1050. 2$        Pop        D0/A0-A2
  1051.         rts
  1052.  
  1053. * Finds first pair of duplicates (HotKeys must be sorted)
  1054. * Return: D0 != -1 means D0 and D1 are the same (and not undefined)
  1055. FindDuplicates    Push        A2
  1056.         lea        TBuf+pw_KeyDefs+HotKey_SIZE(DB),A2
  1057.         moveq        #KeyFuncNumber,D0
  1058.         bra.S        3$
  1059. 1$        move.l        -HotKey_SIZE+HotKey_ID(A2),D1
  1060.         cmp.l        HotKey_ID(A2),D1
  1061.         bne.S        2$
  1062.         cmp.l        #(U_CODE<<16)|U_QUAL,D1
  1063.         bne.S        4$
  1064. 2$        addq.l        #HotKey_SIZE,A2
  1065. 3$        dbf        D0,1$    
  1066.         moveq        #-1,D0
  1067.         bra.S        5$
  1068. 4$        moveq        #0,D0
  1069.         moveq        #0,D1
  1070.         move.b        HotKey_Func(A2),D0
  1071.         move.b        -HotKey_SIZE+HotKey_Func(A2),D1
  1072. 5$        Pop        A2
  1073.         tst.l        D0
  1074.         rts
  1075.  
  1076. * Counts the number of defined hotkeys (HotKeys must be sorted)
  1077. * Return: D0 = count
  1078. CountKeys    Push        D0-D2/A2
  1079.         lea        TBuf+pw_KeyDefs(DB),A2
  1080.         moveq        #0,D0
  1081.         moveq        #KeyFuncNumber,D1
  1082.         bra.S        2$
  1083. 1$        move.w        HotKey_Code(A2),D2
  1084.         cmp.w        #U_CODE,D2
  1085.         beq.S        3$
  1086.         addq.l        #1,D0
  1087.         addq.l        #HotKey_SIZE,A2
  1088. 2$        dbf        D1,1$
  1089. 3$        move.w        D0,TBuf+pw_KeyNum(DB)
  1090.         Pop        D0-D2/A2
  1091.         rts
  1092.  
  1093. SetStrings    Push        D0-D2/A0-A2/A6
  1094.         moveq        #0,D0
  1095.         move.b        PWkPri(PC),D0
  1096.         lea        PBuffer(PC),A0
  1097.         Call        BinToStr
  1098.         moveq        #0,D0
  1099.         move.b        PWkMouseAccel(PC),D0
  1100.         lea        SBuffer(PC),A0
  1101.         Call        BinToStr
  1102.         moveq        #0,D0
  1103.         move.b        PWkMouseThresh(PC),D0
  1104.         lea        TBuffer(PC),A0
  1105.         Call        BinToStr
  1106.         moveq        #0,D0
  1107.         move.l        PWkMTimeout(PC),D0
  1108.         lea        MouseBuffer(PC),A0
  1109.         Call        BinToStr
  1110.         moveq        #0,D0
  1111.         move.l        PWkSTimeout(PC),D0
  1112.         lea        ScreenBuffer(PC),A0
  1113.         Call        BinToStr
  1114.         moveq        #5,D0
  1115.         lea        Gad10(PC),A0
  1116.         movea.l        DWindow(DB),A1
  1117.         suba.l        A2,A2
  1118.         Prepare        Intuition_Call
  1119.         CallLib        RefreshGList
  1120.         Pop        D0-D2/A0-A2/A6
  1121.         rts
  1122.  
  1123. GetStrings    Push        D1-D2/A0-A2/A6
  1124.         moveq        #WRONGPRI,D2
  1125.         lea        PBuffer(PC),A0
  1126.         Call        StrToBin
  1127.         cmp.w        #127,D0
  1128.         bgt.S        1$
  1129.         move.b        D0,TBuf+pw_Pri(DB)
  1130.         lea        SBuffer(PC),A0
  1131.         Call        StrToBin
  1132.         move.b        D0,TBuf+pw_Accel(DB)
  1133.         lea        TBuffer(PC),A0
  1134.         Call        StrToBin
  1135.         move.b        D0,TBuf+pw_Thresh(DB)
  1136.         lea        MouseBuffer(PC),A0
  1137.         Call        StrToBin
  1138.         move.l        D0,TBuf+pw_MTimeout(DB)
  1139.         lea        ScreenBuffer(PC),A0
  1140.         Call        StrToBin
  1141.         move.l        D0,TBuf+pw_STimeout(DB)
  1142.         moveq        #0,D2
  1143. 1$        move.l        D2,D0
  1144.         Pop        D1-D2/A0-A2/A6
  1145.         tst.w        D0
  1146.         rts
  1147.  
  1148. BinToStr    Push        D0-D5/A0
  1149.         tst.l        D0
  1150.         beq.S        7$
  1151.         moveq        #4*4,D1
  1152.         moveq        #'0',D2
  1153.         moveq        #0,D4
  1154. 1$        move.w        D2,D3
  1155.         move.l        9$(PC,D1.l),D5
  1156. 2$        cmp.l        D5,D0
  1157.         blt.S        3$
  1158.         addq.w        #1,D3
  1159.         sub.l        D5,D0
  1160.         bra.S        2$
  1161. 3$        cmp.b        D2,D3
  1162.         bne.S        4$
  1163.         tst.w        D4
  1164.         beq.S        6$
  1165. 4$        moveq        #1,D4
  1166. 5$        move.b        D3,(A0)+
  1167. 6$        subq.w        #4,D1
  1168.         bge.S        1$
  1169.         bra.S        8$
  1170. 7$        move.b        #'0',(A0)+
  1171. 8$        clr.b        (A0)+
  1172.         Pop        D0-D5/A0
  1173.         rts
  1174. 9$        dc.l        1,10,100,1000,10000
  1175.  
  1176.  
  1177. StrToBin    Push        D1/A0
  1178.         moveq        #0,D0
  1179. 1$        move.b        (A0)+,D1
  1180.         beq.S        2$
  1181.         sub.w        #'0',D1
  1182.         mulu        #10,D0
  1183.         add.w        D1,D0
  1184.         bra.S        1$
  1185. 2$        Pop        D1/A0
  1186.         rts
  1187.  
  1188. * Sorts HotKeys on 'Code|Qual'
  1189. SortKeys    Push        D0-D7/A0-A6
  1190.         lea        TBuf(DB),A1
  1191.         lea        PWkVersionID(PC),A0
  1192.         move.w        #pw_SIZE,D0
  1193.         Call        MemCopy
  1194.         moveq        #0,D6
  1195.         lea        TBuf+pw_KeyDefs(DB),A2
  1196. OuterLoop    moveq        #KeyFuncNumber,D5
  1197.         bra.S        ContSort
  1198. InnerLoop    moveq        #KeyFuncNumber,D0
  1199.         sub.w        D5,D0
  1200.         mulu        #HotKey_SIZE,D0
  1201.         lea        -HotKey_SIZE(A2,D0.L),A0
  1202.         lea        HotKey_SIZE(A0),A1
  1203.         move.l        HotKey_ID(A0),D0
  1204.         move.l        HotKey_ID(A1),D1
  1205.         cmp.l        D0,D1
  1206.         bge.S        ContSort
  1207.         move.l        D1,HotKey_ID(A0)
  1208.         move.l        D0,HotKey_ID(A1)
  1209.         move.l        HotKey_Mask(A0),D0
  1210.         move.l        HotKey_Mask(A1),HotKey_Mask(A0)
  1211.         move.l        D0,HotKey_Mask(A1)
  1212. ContSort    subq.w        #1,D5
  1213.         cmp.w        D5,D6
  1214.         blt.S        InnerLoop
  1215.         addq.w        #1,D6
  1216.         cmp.w        #KeyFuncNumber-1,D6
  1217.         blt.S        OuterLoop
  1218.         Pop        D0-D7/A0-A6
  1219.         rts
  1220.  
  1221. * Unsorts HotKeys on to 'Func'
  1222. UnsortKeys    Push        D0-D7/A0-A6
  1223.         lea        TBuf(DB),A0
  1224.         lea        PWkVersionID(PC),A1
  1225.         move.w        #pw_SIZE,D0
  1226.         Call        MemCopy
  1227.         lea        TBuf+pw_KeyDefs(DB),A2
  1228.         moveq        #KeyFuncNumber,D0
  1229.         bra.S        2$
  1230. 1$        moveq        #0,D1
  1231.         move.b        HotKey_Func(A2),D1
  1232.         mulu        #HotKey_SIZE,D1
  1233.         lea        KeyDefines(PC),A1
  1234.         add.l        D1,A1
  1235.         move.l        HotKey_ID(A2),HotKey_ID(A1)
  1236.         move.l        HotKey_Mask(A2),HotKey_Mask(A1)
  1237.         addq.l        #HotKey_SIZE,A2
  1238. 2$        dbf        D0,1$
  1239.         Pop        D0-D7/A0-A6
  1240.         rts
  1241.  
  1242. rtsValue    EQUR        D7
  1243. * Open the input device. Set up the I/O block to add or remove the
  1244. * input handler, and send the request to the input device. Finally,
  1245. * close the device
  1246. * Call:   A0 = ihs
  1247. *      D0 = Function to perform (IND_ADDHANDLER/IND_REMHANDLER)
  1248. * Return: D0 = 0 means succes
  1249. TellInputDevice    Push        D1-D2/rtsValue/A0-A3/A6
  1250.         Prepare        Exec_Call
  1251.         moveq        #-1,rtsValue
  1252.         move.l        D0,D2
  1253.         move.l        A0,A2
  1254.         lea        IReq(DB),A0
  1255.         moveq        #IOSTD_SIZE,D0
  1256.         Call        MemClear
  1257.         lea        IPort(DB),A0
  1258.         moveq        #MP_SIZE,D0
  1259.         Call        MemClear
  1260.         move.l        A0,A3
  1261.         move.b        #NT_MSGPORT,MP+LN_TYPE(A3)    ; mp_Node.ln_Type=NT_MSGPORT;
  1262.         move.b        #PA_SIGNAL,MP_FLAGS(A3)        ; mp_Flags    =PA_SIGNAL;
  1263.         moveq        #-1,D0
  1264.         CallLib        AllocSignal
  1265.         move.b        D0,MP_SIGBIT(A3)        ; mp_SigBit    =MPSigBit;
  1266.         bmi.S        2$
  1267.         suba.l        A1,A1
  1268.         CallLib        FindTask
  1269.         move.l        D0,MP_SIGTASK(A3)        ; mp_SigTask     =FindTask(0);
  1270.         lea        MP_MSGLIST(A3),A0
  1271.         NEWLIST        A0
  1272.         lea        IReq(DB),A1
  1273.         move.l        A3,IO+MN_REPLYPORT(A1)        ; ExtReq->io_Message.mn_ReplyPort   =taskReplyPort;
  1274.         move.b        #NT_MESSAGE,IO+MN+LN_TYPE(A1)    ; ExtReq->io_Message.mn_Node.ln_Type=NT_MESSAGE;
  1275.         lea        InputName(PC),A0        ; input.device
  1276.         moveq        #0,D0                ; unit#
  1277.         moveq        #0,D1                ; flags
  1278.         CallLib        OpenDevice
  1279.         tst.w        D0                ; flag: error if > 0
  1280.         bne.S        1$
  1281.         lea        IReq(DB),A1
  1282.         move.w        D2,IO_COMMAND(A1)
  1283.         lea        ihs_Interrupt(A2),A0
  1284.         move.l        A0,IO_DATA(A1)
  1285.         CallLib        DoIO
  1286.         move.l        D0,rtsValue
  1287.         lea        IReq(DB),A1
  1288.         CallLib        CloseDevice
  1289. 1$        move.b        MP_SIGBIT(A3),D0
  1290.         CallLib        FreeSignal
  1291. 2$        move.l        rtsValue,D0
  1292.         Pop        D1-D2/rtsValue/A0-A3/A6
  1293.         rts
  1294.  
  1295. * Writes the text in the function boxes
  1296. WriteTexts    Push        D0-D1
  1297.         moveq        #FUNCTEXTS+GADTEXTS,D1
  1298.         bra.S        2$
  1299. 1$        move.w        D1,D0
  1300.         Call        WriteTxt
  1301. 2$        dbf        D1,1$
  1302.         Pop        D0-D1
  1303.         rts
  1304.  
  1305. * Call: D0 = Msg-number
  1306. WriteMsg    Push        D0-D4/A0-A2/A6
  1307.         neg.w        D0
  1308.         add.w        #FUNCTEXTS+GADTEXTS,D0
  1309.         lea        TextTab(PC),A1
  1310.         move.l        A1,A2
  1311.         mulu        #TE_SIZE,D0
  1312.         add.l        D0,A2
  1313.         add.w        TE_Offset(A2),A1
  1314.         move.l        A1,A2
  1315.         move.l        DWindow(DB),A0
  1316.         Prepare        Intuition_Call
  1317.         CallLib        SetWindowTitles
  1318.         Pop        D0-D4/A0-A2/A6
  1319.         rts
  1320.  
  1321. * Call: D0 = Msg-number
  1322. WriteTxt    Push        D0-D1/A0-A3/A6
  1323.         Prepare        Gfx_Call
  1324.         lea        TextTab(PC),A2
  1325.         move.l        A2,A3
  1326.         mulu        #TE_SIZE,D0
  1327.         add.l        D0,A2
  1328.         move.w        TE_x(A2),D0
  1329.         move.w        TE_y(A2),D1
  1330.         movea.l        Rp(DB),A1
  1331.         CallLib        Move
  1332.         move.w        TE_Offset(A2),A0
  1333.         add.l        A3,A0
  1334.         Call        StrLen
  1335.         movea.l        Rp(DB),A1
  1336.         CallLib        Text
  1337.         Pop        D0-D1/A0-A3/A6
  1338.         rts
  1339.  
  1340. * Sets the drawing pen.
  1341. * Destroys D0-D1/A0-A1/A6
  1342. SetAPen0    moveq        #0,D0
  1343.         bra.S        SetPenA
  1344. SetAPen1    moveq        #1,D0
  1345. SetPenA        movea.l        Rp(DB),A1        ; D0=Color
  1346.         Prepare        Gfx_Call
  1347.         CallLib        SetAPen
  1348.         rts
  1349.  
  1350. SetDrMd1    moveq        #1,D0
  1351.         bra.S        SetMdDr
  1352. SetDrMd2    moveq        #2,D0
  1353. SetMdDr        movea.l        Rp(DB),A1        ; D0=Drawmode
  1354.         Prepare        Gfx_Call
  1355.         CallLib        SetDrMd
  1356.         rts
  1357.  
  1358.  
  1359. * Call: A0    = Memory area
  1360. *    D0:16 = Count
  1361. MemClear    Push        D0-D1/A0
  1362.         moveq        #0,D1
  1363.         bra.S        2$
  1364. 1$        move.b        D1,(A0)+
  1365. 2$        dbf        D0,1$
  1366.         Pop        D0-D1/A0
  1367.         rts
  1368.  
  1369. * Call: A0   = Source
  1370. *    A1   = Destination
  1371. *    D0:16= Count
  1372. MemCopy        Push        D0/A0-A1
  1373.         bra.S        2$
  1374. 1$        move.b        (A0)+,(A1)+
  1375. 2$        dbf        D0,1$
  1376.         Pop        D0/A0-A1
  1377.         rts
  1378.  
  1379. * Call:   A0 = String
  1380. * Return: D0 = length
  1381. StrLen        Push        A0
  1382.         moveq        #-1,D0
  1383. 1$        addq.l        #1,D0
  1384.         tst.b        (A0)+
  1385.         bne.S        1$
  1386.         Pop        A0
  1387.         rts
  1388.  
  1389. * Return: D0 != means that we got a message
  1390. GetAMessage    Push        D0-D1/A0-A1/A6
  1391.         movea.l        Up(DB),A0
  1392.         Prepare        Exec_Call
  1393.         CallLib        GetMsg
  1394.         tst.l        D0
  1395.         beq.S        NoMessage
  1396. GotAMessage    movea.l        D0,A1
  1397.         move.l        im_Class(A1),Class(DB)
  1398.         move.w        im_Code(A1),Code(DB)
  1399.         move.w        im_Qualifier(A1),Qual(DB)
  1400.         move.l        im_IAddress(A1),IAddress(DB)
  1401.         move.w        im_MouseX(A1),MouseX(DB)
  1402.         move.w        im_MouseY(A1),MouseY(DB)
  1403.         CallLib        ReplyMsg
  1404.         moveq        #1,D0
  1405. NoMessage    Pop        D0-D1/A0-A1/A6
  1406.         rts
  1407.  
  1408. *====================== Data-definition start =======================
  1409.  rStart
  1410.  rWord        Quit
  1411.  rAPtr        PProcess
  1412.  rAPtr        DosBase
  1413.  rAPtr        GraphBase
  1414.  rAPtr        IntBase
  1415.  rLong        WBenchMsg
  1416.  rAPtr        FHandle
  1417.  rAPtr        DScreen
  1418.  rAPtr        DWindow
  1419.  rAPtr        ScrVp            ; ViewPort
  1420.  rAPtr        Rp            ; RastPort
  1421.  rAPtr        Up            ; UserPort
  1422.  rLong        Class            ; IDCMP->Class
  1423.  rWord        Code            ; IDCMP->Code
  1424.  rWord        Qual            ; IDCMP->Qualifier
  1425.  rLong        IAddress        ; IDCMP->IAddress
  1426.  rWord        MouseX            ; IDCMP->MouseX
  1427.  rWord        MouseY            ; IDCMP->MouseY
  1428.  rAPtr        CurFunc            ; Ptr to FuncBox
  1429.  rAPtr        CurCode            ; Ptr to KeyBox
  1430.  rStorage    IReq,IOSTD_SIZE
  1431.  rStorage    IPort,MP_SIZE
  1432.  rStorage    TBuf,pw_SIZE
  1433.  rEnd
  1434.  
  1435. StrBuf        dc.b        ' '
  1436. DosName        dc.b        'dos.library',0
  1437. GfxName        dc.b        'graphics.library',0
  1438. IntName        dc.b        'intuition.library',0
  1439. InputName    dc.b        'input.device',0
  1440. PWkeysPortName    PWkeys_PortName
  1441.         EVEN
  1442.  
  1443. ScrW        =640
  1444. ScrH        =197
  1445. NewS        dc.w        0,0,ScrW,ScrH,PLANES
  1446.         dc.b        0,1
  1447.         dc.w        V_HIRES,CUSTOMSCREEN
  1448.         dc.l        TxtAttr,0,0,0
  1449. IDCMP_Flags    =GADGETUP|MOUSEBUTTONS
  1450. Other_Flags    =NOCAREREFRESH|ACTIVATE|BORDERLESS
  1451. NewW        dc.w        0,SWDIFF,ScrW,ScrH-SWDIFF
  1452.         dc.b        0,1
  1453.         dc.l        IDCMP_Flags,Other_Flags,GadgetList,0,0,0,0
  1454.         dc.w        0,0,0,0,CUSTOMSCREEN
  1455.     IFD CUSTOMCOLORS
  1456. ColorTable    dc.w        $0AAA,$0000
  1457.     ENDC
  1458.  
  1459. GadgetList
  1460. Gad1        Gadget        Gad2,524,4,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
  1461.         Gadget2        BBorder,0,0,0,0,DoCheck-GJ,0
  1462. Gad2        Gadget        Gad3,586,4,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
  1463.         Gadget2        BBorder,0,0,0,0,DoQuit-GJ,0
  1464. Gad3        Gadget        Gad4,524,20,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
  1465.         Gadget2        BBorder,0,0,0,0,DoUndo-GJ,0
  1466. Gad4        Gadget        Gad5,586,20,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
  1467.         Gadget2        BBorder,0,0,0,0,DoClear-GJ,0
  1468. Gad5        Gadget        Gad6,524,36,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
  1469.         Gadget2        BBorder,0,0,0,0,DoImport-GJ,0
  1470. Gad6        Gadget        Gad7,586,36,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
  1471.         Gadget2        BBorder,0,0,0,0,DoExport-GJ,0
  1472. Gad7        Gadget        Gad8,524,52,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
  1473.         Gadget2        BBorder,0,0,0,0,DoSave-GJ,0
  1474. Gad8        Gadget        Gad9,586,52,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
  1475.         Gadget2        BBorder,0,0,0,0,DoLoad-GJ,0
  1476. Gad9        Gadget        Gad10,437,105,FWIDTH,FHEIGHT,GADGHCOMP,RELVERIFY,STRGADGET
  1477.         Gadget2        FBorder,0,0,0,FileInfo,DoGadgets-GJ,0
  1478. Gad10        Gadget        Gad11,256,89,TIMEW,TIMEH,GADGHCOMP,RELVERIFY|LONGINT,STRGADGET
  1479.         Gadget2        TBorder,0,0,0,ScreenInfo,DoGadgets-GJ,0
  1480. Gad11        Gadget        Gad12,348,89,TIMEW,TIMEH,GADGHCOMP,RELVERIFY|LONGINT,STRGADGET
  1481.         Gadget2        TBorder,0,0,0,MouseInfo,DoGadgets-GJ,0
  1482. Gad12        Gadget        Gad13,440,89,PRIW,PRIH,GADGHCOMP,RELVERIFY|LONGINT,STRGADGET
  1483.         Gadget2        PBorder,0,0,0,PriInfo,DoGadgets-GJ,0
  1484. Gad13        Gadget        Gad14,526,89,SPEEDW,SPEEDH,GADGHCOMP,RELVERIFY|LONGINT,STRGADGET
  1485.         Gadget2        SBorder,0,0,0,SpeedInfo,DoGadgets-GJ,0
  1486. Gad14        Gadget        0,597,89,SPEEDW,SPEEDH,GADGHCOMP,RELVERIFY|LONGINT,STRGADGET
  1487.         Gadget2        SBorder,0,0,0,ThresInfo,DoGadgets-GJ,0
  1488.  
  1489. FileBufLen    =80
  1490. FileInfo    dc.l        FBuffer,0
  1491.         dc.w        0,FileBufLen,0,0,0,0,0,0
  1492.         dc.l        0,0,0
  1493. FBuffer        dc.b        'S:PWkeys.Config'
  1494.         dcb.b        FileBufLen-14,0
  1495.         EVEN
  1496. SpeedInfo    dc.l        SBuffer,0
  1497.         dc.w        0,2,0,0,0,0,0,0
  1498.         dc.l        0,0,0
  1499. SBuffer        dcb.b        3,0
  1500.         EVEN
  1501. ThresInfo    dc.l        TBuffer,0
  1502.         dc.w        0,2,0,0,0,0,0,0
  1503.         dc.l        0,0,0
  1504. TBuffer        dcb.b        3,0
  1505.         EVEN
  1506. PriInfo        dc.l        PBuffer,0
  1507.         dc.w        0,4,0,0,0,0,0,0
  1508.         dc.l        0,0,0
  1509. PBuffer        dcb.b        5,0
  1510.         EVEN
  1511. ScreenInfo    dc.l        ScreenBuffer,0
  1512.         dc.w        0,5,0,0,0,0,0,0
  1513.         dc.l        0,0,0
  1514. ScreenBuffer    dcb.b        6,0
  1515.         EVEN
  1516. MouseInfo    dc.l        MouseBuffer,0
  1517.         dc.w        0,5,0,0,0,0,0,0
  1518.         dc.l        0,0,0
  1519. MouseBuffer    dcb.b        6,0
  1520.         EVEN
  1521.  
  1522. TxtAttr        dc.l        FontName
  1523.         dc.w        TOPAZ_EIGHTY
  1524.         dc.b        FS_NORMAL,FPB_ROMFONT
  1525. FontName    dc.b        'topaz.font',0
  1526.         EVEN
  1527.  
  1528. UArrowImage    Image        0,0*FySpace,16,8,1,UArrowData,%00000001,%00000000,DArrowImage
  1529. DArrowImage    Image        0,1*FySpace,16,8,1,DArrowData,%00000001,%00000000,LArrowImage
  1530. LArrowImage    Image        0,2*FySpace,16,7,1,LArrowData,%00000001,%00000000,RArrowImage
  1531. RArrowImage    Image        1,3*FySpace,16,7,1,RArrowData,%00000001,%00000000,LUArrowImage
  1532. LUArrowImage    Image        2,4*FySpace,16,7,1,LUArrowData,%00000001,%00000000,LDArrowImage
  1533. LDArrowImage    Image        2,5*FySpace,16,7,1,LDArrowData,%00000001,%00000000,RUArrowImage
  1534. RUArrowImage    Image        0,6*FySpace,16,7,1,RUArrowData,%00000001,%00000000,RDArrowImage
  1535. RDArrowImage    Image        0,7*FySpace,16,7,1,RDArrowData,%00000001,%00000000,0
  1536.  
  1537. FWIDTH        =204
  1538. FHEIGHT        =11
  1539. FBorder        Border        -6,-3,1,0,1,17,1$,0
  1540. 1$        dc.w        2,0,FWIDTH+1,0,FWIDTH+3,2,FWIDTH+3,FHEIGHT-1,FWIDTH+1,FHEIGHT+1,2,FHEIGHT+1,0,FHEIGHT-1,0,2,2,0
  1541.         dc.w        1,0,-1,2,-1,FHEIGHT-1,1,FHEIGHT+1,FWIDTH+2,FHEIGHT+1,FWIDTH+4,FHEIGHT-1,FWIDTH+4,2,FWIDTH+2,0
  1542. SPEEDW        =24
  1543. SPEEDH        =11
  1544. SBorder        Border        -6,-3,1,0,1,17,1$,0
  1545. 1$        dc.w        2,0,SPEEDW+1,0,SPEEDW+3,2,SPEEDW+3,SPEEDH-1,SPEEDW+1,SPEEDH+1,2,SPEEDH+1,0,SPEEDH-1,0,2,2,0
  1546.         dc.w        1,0,-1,2,-1,SPEEDH-1,1,SPEEDH+1,SPEEDW+2,SPEEDH+1,SPEEDW+4,SPEEDH-1,SPEEDW+4,2,SPEEDW+2,0
  1547. PRIW        =40
  1548. PRIH        =11
  1549. PBorder        Border        -6,-3,1,0,1,17,1$,0
  1550. 1$        dc.w        2,0,PRIW+1,0,PRIW+3,2,PRIW+3,PRIH-1,PRIW+1,PRIH+1,2,PRIH+1,0,PRIH-1,0,2,2,0
  1551.         dc.w        1,0,-1,2,-1,PRIH-1,1,PRIH+1,PRIW+2,PRIH+1,PRIW+4,PRIH-1,PRIW+4,2,PRIW+2,0
  1552. TIMEW        =48
  1553. TIMEH        =11
  1554. TBorder        Border        -6,-3,1,0,1,17,1$,0
  1555. 1$        dc.w        2,0,TIMEW+1,0,TIMEW+3,2,TIMEW+3,TIMEH-1,TIMEW+1,TIMEH+1,2,TIMEH+1,0,TIMEH-1,0,2,2,0
  1556.         dc.w        1,0,-1,2,-1,TIMEH-1,1,TIMEH+1,TIMEW+2,TIMEH+1,TIMEW+4,TIMEH-1,TIMEW+4,2,TIMEW+2,0
  1557. WFuncBorder    Border        1,0,1,0,1,24,1$,0
  1558. 1$        dc.w        2,0,FFw1+1,0,FFw1+3,2,FFw1+3,FFh1-1,FFw1+1,FFh1+1,2,FFh1+1,0,FFh1-1,0,2,2,0
  1559.         dc.w        1,0,-1,2,-1,FFh1-1,1,FFh1+1,FFw1+2,FFh1+1,FFw1+4,FFh1-1,FFw1+4,2,FFw1+2,0
  1560.         dc.w        FFw1+4,2,FFw1+4,10,0,10,95,10,95,FFh1,94,FFh1,94,10
  1561. SFuncBorder    Border        1,0,1,0,1,20,1$,0
  1562. 1$        dc.w        2,0,FFw2+1,0,FFw2+3,2,FFw2+3,FFh2-1,FFw2+1,FFh2+1,2,FFh2+1,0,FFh2-1,0,2,2,0
  1563.         dc.w        1,0,-1,2,-1,FFh2-1,1,FFh2+1,FFw2+2,FFh2+1,FFw2+4,FFh2-1,FFw2+4,2,FFw2+2,0
  1564.         dc.w        FFw2+4,2,FFw2+4,10,0,10
  1565. MFuncBorder    Border        1,0,1,0,1,20,1$,0
  1566. 1$        dc.w        2,0,FFw3+1,0,FFw3+3,2,FFw3+3,FFh3-1,FFw3+1,FFh3+1,2,FFh3+1,0,FFh3-1,0,2,2,0
  1567.         dc.w        1,0,-1,2,-1,FFh3-1,1,FFh3+1,FFw3+2,FFh3+1,FFw3+4,FFh3-1,FFw3+4,2,FFw3+2,0
  1568.         dc.w        FFw3+4,2,FFw3+4,10,0,10
  1569. BWIDTH        =50
  1570. BHEIGHT        =11
  1571. BBorder        Border        -2,-1,1,0,1,17,1$,0
  1572. 1$        dc.w        2,0,BWIDTH+1,0,BWIDTH+3,2,BWIDTH+3,BHEIGHT-1,BWIDTH+1,BHEIGHT+1,2,BHEIGHT+1,0,BHEIGHT-1,0,2,2,0
  1573.         dc.w        1,0,-1,2,-1,BHEIGHT-1,1,BHEIGHT+1,BWIDTH+2,BHEIGHT+1,BWIDTH+4,BHEIGHT-1,BWIDTH+4,2,BWIDTH+2,0
  1574. KEYBW        =ScrW-6
  1575. KEYBH        =83
  1576. KeybBorder    Border        1,0,1,0,1,17,1$,0
  1577. 1$        dc.w        2,0,KEYBW+1,0,KEYBW+3,2,KEYBW+3,KEYBH-1,KEYBW+1,KEYBH+1,2,KEYBH+1,0,KEYBH-1,0,2,2,0
  1578.         dc.w        1,0,-1,2,-1,KEYBH-1,1,KEYBH+1,KEYBW+2,KEYBH+1,KEYBW+4,KEYBH-1,KEYBW+4,2,KEYBW+2,0
  1579.  
  1580. TE_x        =0
  1581. TE_y        =2
  1582. TE_Offset    =4
  1583. TE_SIZE        =6
  1584. TEntry        MACRO        'TextEntry'
  1585.         dc.w        \1,\2,\3-TextTab
  1586.         ENDM
  1587.  
  1588. FFx1        =0
  1589. FFy1        =13
  1590. FFw1        =208
  1591. FFh1        =94
  1592. FFx2        =224
  1593. FFy2        =13
  1594. FFw2        =116
  1595. FFh2        =49
  1596. FFx3        =356
  1597. FFy3        =13
  1598. FFw3        =146
  1599. FFh3        =40
  1600.  
  1601. FySpace        =9
  1602. FTx1        =FFx1+8
  1603. FTx1b        =FFx1+102
  1604. FTy1        =FFy1+19
  1605. FTx2        =FFx2+8
  1606. FTy2        =FFy2+19
  1607. FTx3        =FFx3+8
  1608. FTy3        =FFy3+19
  1609.  
  1610. TextTab        TEntry        FTx1,FTy1+0*FySpace,1$
  1611.         TEntry        FTx1,FTy1+1*FySpace,2$
  1612.         TEntry        FTx1,FTy1+2*FySpace,3$
  1613.         TEntry        FTx1,FTy1+3*FySpace,4$
  1614.         TEntry        FTx1,FTy1+4*FySpace,5$
  1615.         TEntry        FTx1,FTy1+5*FySpace,6$
  1616.         TEntry        FTx1,FTy1+6*FySpace,7$
  1617.         TEntry        FTx1,FTy1+7*FySpace,8$
  1618.         TEntry        FTx1,FTy1+8*FySpace,9$
  1619.         TEntry        FTx1b,FTy1+0*FySpace,10$
  1620.         TEntry        FTx1b,FTy1+1*FySpace,11$
  1621.         TEntry        FTx1b,FTy1+2*FySpace,12$
  1622.         TEntry        FTx1b,FTy1+3*FySpace,13$
  1623.         TEntry        FTx1b,FTy1+4*FySpace,14$
  1624.         TEntry        FTx1b,FTy1+5*FySpace,15$
  1625.         TEntry        FTx1b,FTy1+6*FySpace,16$
  1626.         TEntry        FTx1b,FTy1+7*FySpace,17$
  1627.         TEntry        FTx1b,FTy1+8*FySpace,18$
  1628.         TEntry        FTx2,FTy2+0*FySpace,19$
  1629.         TEntry        FTx2,FTy2+1*FySpace,20$
  1630.         TEntry        FTx2,FTy2+2*FySpace,21$
  1631.         TEntry        FTx2,FTy2+3*FySpace,22$
  1632.         TEntry        FTx3,FTy3+0*FySpace,23$
  1633.         TEntry        FTx3,FTy3+1*FySpace,24$
  1634.         TEntry        FTx3,FTy3+2*FySpace,25$
  1635.         TEntry        FFx1+(FFw1-6*8)/2,FFy1+8,26$
  1636.         TEntry        FFx2+(FFw2-6*8)/2,FFy2+8,27$
  1637.         TEntry        FFx3+(FFw3-13*8)/2,FFy3+8,28$
  1638.  
  1639.         TEntry        529,22,29$
  1640.         TEntry        594,22,30$
  1641.         TEntry        532,38,31$
  1642.         TEntry        592,38,32$
  1643.         TEntry        525,54,33$
  1644.         TEntry        587,54,34$
  1645.         TEntry        532,70,35$
  1646.         TEntry        594,70,36$
  1647.         TEntry        234,93,37$
  1648.         TEntry        332,93,38$
  1649.         TEntry        424,93,39$
  1650.         TEntry        512,93,40$
  1651.         TEntry        568,93,41$
  1652.  
  1653.         TEntry        10,8,42$
  1654.         TEntry        10,8,43$
  1655.         TEntry        10,8,44$
  1656.         TEntry        10,8,45$
  1657.         TEntry        10,8,46$
  1658.         TEntry        10,8,47$
  1659.         TEntry        10,8,48$
  1660.         TEntry        10,8,49$
  1661.         TEntry        10,8,50$
  1662.         TEntry        10,8,51$
  1663.         TEntry        10,8,52$
  1664.         TEntry        10,8,53$
  1665.         TEntry        10,8,54$
  1666.         TEntry        10,8,55$
  1667.  
  1668. * Function texts
  1669. 1$
  1670. 2$
  1671. 3$
  1672. 4$        dc.b        'Move',0
  1673. 5$
  1674. 6$
  1675. 7$
  1676. 8$        dc.b        'Place',0
  1677. 9$        dc.b        'To center',0
  1678. 10$        dc.b        'To front',0
  1679. 11$        dc.b        'To back',0
  1680. 12$        dc.b        'Back to front',0
  1681. 13$        dc.b        'Front to back',0
  1682. 14$        dc.b        'Activate prev',0
  1683. 15$        dc.b        'Activate next',0
  1684. 16$        dc.b        'Minimize',0
  1685. 17$        dc.b        'Maximize',0
  1686. 18$        dc.b        'Refresh',0
  1687. 19$        dc.b        'Back to front',0
  1688. 20$        dc.b        'Front to back',0
  1689. 21$        dc.b        'Sub BitPlane',0
  1690. 22$        dc.b        'Add BitPlane',0
  1691. 23$        dc.b        'Toggle Input-Lock',0
  1692. 24$        dc.b        'Toggle Fast-Mouse',0
  1693. 25$        dc.b        'Toggle Sun-Mouse',0
  1694. 26$        dc.b        'Window',0
  1695. 27$        dc.b        'Screen',0
  1696. 28$        dc.b        'Miscellaneous',0
  1697.  
  1698. * Gadget texts
  1699. 29$        dc.b        'Check',0
  1700. 30$        dc.b        'Quit',0
  1701. 31$        dc.b        'Undo',0
  1702. 32$        dc.b        'Clear',0
  1703. 33$        dc.b        'Import',0
  1704. 34$        dc.b        'Export',0
  1705. 35$        dc.b        'Save',0
  1706. 36$        dc.b        'Load',0
  1707. 37$        dc.b        'Screen off',0
  1708. 38$        dc.b        'Mouse off',0
  1709. 39$        dc.b        'Priority',0
  1710. 40$        dc.b        'Speed',0
  1711. 41$        dc.b        'Threshold',0
  1712.  
  1713. * Message texts
  1714. 42$        SetPWkeys_Title
  1715. 43$        dc.b        "Error: Can't find file !",0
  1716. 44$        dc.b        "Error: File is not a valid PWkeys-file !",0
  1717. 45$        dc.b        "Error: Can't write file !",0
  1718. 46$        dc.b        "Settings have now been loaded from file !",0
  1719. 47$        dc.b        "Settings have now been written to file !",0
  1720. 48$        dc.b        "Error: The PWkeys-handler is not installed !",0
  1721. 49$        dc.b        "Error: Can't remove handler. Haven't installed settings !",0
  1722. 50$        dc.b        "Error: Can't re-install handler. Handler has now been removed !!!",0
  1723. 51$        dc.b        "Settings have now been imported from PWkeys !",0
  1724. 52$        dc.b        "Settings have now been exported to PWkeys !",0
  1725. 53$        dc.b        "Error: Duplicate hotkey definitions !!",0
  1726. 54$        dc.b        "Error: Handler-priority has to be 0-127 (preferably 51-127) !!",0
  1727. 55$        dc.b        "The settings are acceptable !",0
  1728.         EVEN
  1729.  
  1730. Box_x        =0
  1731. Box_y        =2
  1732. Box_Width    =4
  1733. Box_Height    =6
  1734. Box_Flags    =8
  1735. Box_SIZE    =9
  1736. Box        MACRO
  1737.         dc.w        \1,\2,\3,\4    ; x,y,width,height
  1738.         dc.b        \5        ; Flags
  1739.         ENDM
  1740.  
  1741. FuncBox_HotKey    =10
  1742. FuncBox_SIZE    =14
  1743. FuncBox        MACRO        'Functionbox'
  1744.         Box        \1,\2,\3,\4,\5    ; Box definition
  1745.         dc.b        0        ; Pad
  1746.         dc.l        \6        ; Function
  1747.         ENDM
  1748.  
  1749. KeyBox_Char    =9
  1750. KeyBox_Code    =10
  1751. KeyBox_Qual    =12
  1752. KeyBox_SIZE    =14
  1753. FKeyBox_SIZE    =14
  1754. KeyBox        MACRO        'Keybox'
  1755.         Box        \1,\2,\3,\4,\5    ; Box definition
  1756.         dc.b        \6        ; Char
  1757.         dc.w        \7,\8        ; Raw, Qual
  1758.         ENDM
  1759.  
  1760. FBx1        =FFx1+4
  1761. FBx1b        =FFx1+98
  1762. FBy1        =FFy1+11
  1763. FBx2        =FFx2+4
  1764. FBy2        =FFy2+11
  1765. FBx3        =FFx3+4
  1766. FBy3        =FFy3+11
  1767.  
  1768. FBw1        =88
  1769. FBw1b        =112
  1770. FBw2        =FFw2-4
  1771. FBw3        =FFw3-4
  1772. FBh        =11
  1773.  
  1774. Funcs        FuncBox        FBx1,FBy1+0*FySpace,FBw1,FBh,0,HK1
  1775.         FuncBox        FBx1,FBy1+1*FySpace,FBw1,FBh,0,HK2
  1776.         FuncBox        FBx1,FBy1+2*FySpace,FBw1,FBh,0,HK3
  1777.         FuncBox        FBx1,FBy1+3*FySpace,FBw1,FBh,0,HK4
  1778.         FuncBox        FBx1,FBy1+4*FySpace,FBw1,FBh,0,HK5
  1779.         FuncBox        FBx1,FBy1+5*FySpace,FBw1,FBh,0,HK6
  1780.         FuncBox        FBx1,FBy1+6*FySpace,FBw1,FBh,0,HK7
  1781.         FuncBox        FBx1,FBy1+7*FySpace,FBw1,FBh,0,HK8
  1782.         FuncBox        FBx1,FBy1+8*FySpace,FBw1,FBh,0,HK9
  1783.         FuncBox        FBx1b,FBy1+0*FySpace,FBw1b,FBh,0,HK10
  1784.         FuncBox        FBx1b,FBy1+1*FySpace,FBw1b,FBh,0,HK11
  1785.         FuncBox        FBx1b,FBy1+2*FySpace,FBw1b,FBh,0,HK12
  1786.         FuncBox        FBx1b,FBy1+3*FySpace,FBw1b,FBh,0,HK13
  1787.         FuncBox        FBx1b,FBy1+4*FySpace,FBw1b,FBh,0,HK14
  1788.         FuncBox        FBx1b,FBy1+5*FySpace,FBw1b,FBh,0,HK15
  1789.         FuncBox        FBx1b,FBy1+6*FySpace,FBw1b,FBh,0,HK16
  1790.         FuncBox        FBx1b,FBy1+7*FySpace,FBw1b,FBh,0,HK17
  1791.         FuncBox        FBx1b,FBy1+8*FySpace,FBw1b,FBh,0,HK18
  1792.         FuncBox        FBx2,FBy2+0*FySpace,FBw2,FBh,0,HK19
  1793.         FuncBox        FBx2,FBy2+1*FySpace,FBw2,FBh,0,HK20
  1794.         FuncBox        FBx2,FBy2+2*FySpace,FBw2,FBh,0,HK21
  1795.         FuncBox        FBx2,FBy2+3*FySpace,FBw2,FBh,0,HK22
  1796.         FuncBox        FBx3,FBy3+0*FySpace,FBw3,FBh,0,HK23
  1797.         FuncBox        FBx3,FBy3+1*FySpace,FBw3,FBh,0,HK24
  1798.         FuncBox        FBx3,FBy3+2*FySpace,FBw3,FBh,0,HK25
  1799.         FuncBox        -1,-1,-1,-1,0,Funcs
  1800.  
  1801. Absx        =20
  1802. KH        =10
  1803. FM        =8
  1804. FW        =27
  1805. FSPACE        =6
  1806. FD        =FW+FSPACE
  1807. NW        =20
  1808. NSPACE        =6
  1809. ND        =NW+NSPACE
  1810. KPx        =Absx+498
  1811. Arx        =Absx+410
  1812. KY        =ScrH-80
  1813. R1x        =Absx+40
  1814. R2x        =Absx+40
  1815. R3x        =Absx+50
  1816. R4x        =Absx+56
  1817. R5x        =Absx+70
  1818. R1y        =KY+0*(KH+3)
  1819. R2y        =KY+1*(KH+3)
  1820. R3y        =KY+2*(KH+3)
  1821. R4y        =KY+3*(KH+3)
  1822. R5y        =KY+4*(KH+3)
  1823. R6y        =KY+5*(KH+3)
  1824.  
  1825. Keys
  1826. ReturnKey1
  1827.  KeyBox        382,R3y,NW+16,KH*2+3,0,0,RETURN,0
  1828. ReturnKey2
  1829.  KeyBox        363,R3y+13,20,KH,0,0,RETURN,0
  1830.  KeyBox        Absx,R1y,NW,KH,0,0,ESC,0
  1831.  KeyBox        R1x+00*FD,R1y,FW,KH,0,0,F1,0
  1832.  KeyBox        R1x+01*FD,R1y,FW,KH,0,0,F2,0
  1833.  KeyBox        R1x+02*FD,R1y,FW,KH,0,0,F3,0
  1834.  KeyBox        R1x+03*FD,R1y,FW,KH,0,0,F4,0
  1835.  KeyBox        R1x+04*FD,R1y,FW,KH,0,0,F5,0
  1836.  KeyBox        R1x+FM+05*FD,R1y,FW,KH,0,0,F6,0
  1837.  KeyBox        R1x+FM+06*FD,R1y,FW,KH,0,0,F7,0
  1838.  KeyBox        R1x+FM+07*FD,R1y,FW,KH,0,0,F8,0
  1839.  KeyBox        R1x+FM+08*FD,R1y,FW,KH,0,0,F9,0
  1840.  KeyBox        R1x+FM+09*FD,R1y,FW,KH,0,0,F10,0
  1841.  KeyBox        Absx,R2y,FW+6,KH,0,'`',$00,0
  1842.  KeyBox        R2x+00*ND,R2y,NW,KH,0,'1',$01,0
  1843.  KeyBox        R2x+01*ND,R2y,NW,KH,0,'2',$02,0
  1844.  KeyBox        R2x+02*ND,R2y,NW,KH,0,'3',$03,0
  1845.  KeyBox        R2x+03*ND,R2y,NW,KH,0,'4',$04,0
  1846.  KeyBox        R2x+04*ND,R2y,NW,KH,0,'5',$05,0
  1847.  KeyBox        R2x+05*ND,R2y,NW,KH,0,'6',$06,0
  1848.  KeyBox        R2x+06*ND,R2y,NW,KH,0,'7',$07,0
  1849.  KeyBox        R2x+07*ND,R2y,NW,KH,0,'8',$08,0
  1850.  KeyBox        R2x+08*ND,R2y,NW,KH,0,'9',$09,0
  1851.  KeyBox        R2x+09*ND,R2y,NW,KH,0,'0',$0A,0
  1852.  KeyBox        R2x+10*ND,R2y,NW,KH,0,'-',$0B,0
  1853.  KeyBox        R2x+11*ND,R2y,NW,KH,0,'=',$0C,0
  1854.  KeyBox        R2x+12*ND,R2y,NW,KH,0,'\',$0D,0
  1855.  KeyBox        R2x+13*ND,R2y,NW,KH,0,0,BACKSPACE,0
  1856.  KeyBox        Arx,R2y,FW+6,KH,0,0,DEL,0
  1857.  KeyBox        Arx+8+FD,R2y,FW+6,KH,0,0,HELP,0
  1858.  KeyBox        KPx+00*ND,R2y,NW,KH,0,'[',$5A,0
  1859.  KeyBox        KPx+01*ND,R2y,NW,KH,0,']',$5B,0
  1860.  KeyBox        KPx+02*ND,R2y,NW,KH,0,'\',$5C,0
  1861.  KeyBox        KPx+03*ND,R2y,NW,KH,0,'*',$5D,0
  1862.  KeyBox        Absx,R3y,FW+16,KH,0,0,TAB,0
  1863.  KeyBox        R3x+00*ND,R3y,NW,KH,0,'q',$10,0
  1864.  KeyBox        R3x+01*ND,R3y,NW,KH,0,'w',$11,0
  1865.  KeyBox        R3x+02*ND,R3y,NW,KH,0,'e',$12,0
  1866.  KeyBox        R3x+03*ND,R3y,NW,KH,0,'r',$13,0
  1867.  KeyBox        R3x+04*ND,R3y,NW,KH,0,'t',$14,0
  1868.  KeyBox        R3x+05*ND,R3y,NW,KH,0,'y',$15,0
  1869.  KeyBox        R3x+06*ND,R3y,NW,KH,0,'u',$16,0
  1870.  KeyBox        R3x+07*ND,R3y,NW,KH,0,'i',$17,0
  1871.  KeyBox        R3x+08*ND,R3y,NW,KH,0,'o',$18,0
  1872.  KeyBox        R3x+09*ND,R3y,NW,KH,0,'p',$19,0
  1873.  KeyBox        R3x+10*ND,R3y,NW,KH,0,'[',$1A,0
  1874.  KeyBox        R3x+11*ND,R3y,NW,KH,0,']',$1B,0
  1875.  KeyBox        KPx+00*ND,R3y,NW,KH,0,'7',$3D,0
  1876.  KeyBox        KPx+01*ND,R3y,NW,KH,0,'8',$3E,0
  1877.  KeyBox        KPx+02*ND,R3y,NW,KH,0,'9',$3F,0
  1878.  KeyBox        KPx+03*ND,R3y,NW,KH,0,'-',$4A,0
  1879.  KeyBox        Absx,R4y,NW+3,KH,0,0,$63,CTRL
  1880.  KeyBox        Absx+ND+3,R4y,NW,KH,0,0,$62,CAPSLOCK
  1881.  KeyBox        R4x+00*ND,R4y,NW,KH,0,'a',$20,0
  1882.  KeyBox        R4x+01*ND,R4y,NW,KH,0,'s',$21,0
  1883.  KeyBox        R4x+02*ND,R4y,NW,KH,0,'d',$22,0
  1884.  KeyBox        R4x+03*ND,R4y,NW,KH,0,'f',$23,0
  1885.  KeyBox        R4x+04*ND,R4y,NW,KH,0,'g',$24,0
  1886.  KeyBox        R4x+05*ND,R4y,NW,KH,0,'h',$25,0
  1887.  KeyBox        R4x+06*ND,R4y,NW,KH,0,'j',$26,0
  1888.  KeyBox        R4x+07*ND,R4y,NW,KH,0,'k',$27,0
  1889.  KeyBox        R4x+08*ND,R4y,NW,KH,0,'l',$28,0
  1890.  KeyBox        R4x+09*ND,R4y,NW,KH,0,';',$29,0
  1891.  KeyBox        R4x+10*ND,R4y,NW,KH,0,"'",$2A,0
  1892.  KeyBox        Arx+1*ND,R4y,NW,KH,0,0,UPARROW,0
  1893.  KeyBox        KPx+00*ND,R4y,NW,KH,0,'4',$2D,0
  1894.  KeyBox        KPx+01*ND,R4y,NW,KH,0,'5',$2E,0
  1895.  KeyBox        KPx+02*ND,R4y,NW,KH,0,'6',$2F,0
  1896.  KeyBox        KPx+03*ND,R4y,NW,KH,0,'+',$5E,0
  1897.  KeyBox        Absx,R5y,63,KH,0,0,$60,LSHIFT
  1898.  KeyBox        R5x+00*ND,R5y,NW,KH,0,'z',$31,0
  1899.  KeyBox        R5x+01*ND,R5y,NW,KH,0,'x',$32,0
  1900.  KeyBox        R5x+02*ND,R5y,NW,KH,0,'c',$33,0
  1901.  KeyBox        R5x+03*ND,R5y,NW,KH,0,'v',$34,0
  1902.  KeyBox        R5x+04*ND,R5y,NW,KH,0,'b',$35,0
  1903.  KeyBox        R5x+05*ND,R5y,NW,KH,0,'n',$36,0
  1904.  KeyBox        R5x+06*ND,R5y,NW,KH,0,'m',$37,0
  1905.  KeyBox        R5x+07*ND,R5y,NW,KH,0,$2C,$38,0        ;','
  1906.  KeyBox        R5x+08*ND,R5y,NW,KH,0,'.',$39,0
  1907.  KeyBox        R5x+09*ND,R5y,NW,KH,0,'/',$3A,0
  1908.  KeyBox        R5x+10*ND,R5y,67,KH,0,0,$61,RSHIFT
  1909.  KeyBox        Arx+00*ND,R5y,NW,KH,0,0,LEFTARROW,0
  1910.  KeyBox        Arx+01*ND,R5y,NW,KH,0,0,DOWNARROW,0
  1911.  KeyBox        Arx+02*ND,R5y,NW,KH,0,0,RIGHTARROW,0
  1912.  KeyBox        KPx+00*ND,R5y,NW,KH,0,'1',$1D,0
  1913.  KeyBox        KPx+01*ND,R5y,NW,KH,0,'2',$1E,0
  1914.  KeyBox        KPx+02*ND,R5y,NW,KH,0,'3',$1F,0
  1915.  KeyBox        KPx+03*ND,R5y,NW,KH*2+3,0,0,ENTER,0
  1916.  KeyBox        Absx+10,R6y,FW+2,KH,0,0,$64,LALT
  1917.  KeyBox        Absx+10+FD+2,R6y,FW+2,KH,0,0,$66,LAMIGA
  1918.  KeyBox        100,R6y,232,KH,0,0,SPACE,0
  1919.  KeyBox        338,R6y,FW+2,KH,0,0,$67,RAMIGA
  1920.  KeyBox        338+FD+2,R6y,FW+2,KH,0,0,$65,RALT
  1921.  KeyBox        KPx+00*ND,R6y,NW+ND,KH,0,'0',$0F,0
  1922.  KeyBox        KPx+02*ND,R6y,NW,KH,0,'.',$3C,0
  1923.  KeyBox        -1,-1,-1,-1,0,0,0,0
  1924.  
  1925. PWkVersionID    dc.l        'PWKF'
  1926. PWkVersionNum    dc.w        PWkeysVersion,PWkeysRevision
  1927. PWkPri        dc.b        PWkeysPri,0
  1928. PWkMouseAccel    dc.b        PWkeysMSpeed
  1929. PWkMouseThresh    dc.b        PWkeysMThresh
  1930. PWkMTimeout    dc.l        PWkeysMTimeout
  1931. PWkSTimeout    dc.l        PWkeysSTimeout
  1932. PWkMWaitTime    dc.l        0
  1933. PWkSWaitTime    dc.l        0
  1934. PWkHotKeys    dc.w        KeyFuncNumber
  1935. KeyDefines
  1936. HK1        HotKey        KP8,LSHIFT|LAMIGA,LSHIFT|LAMIGA,W_TO_TOP
  1937. HK2        HotKey        KP2,LSHIFT|LAMIGA,LSHIFT|LAMIGA,W_TO_BOTTOM
  1938. HK3        HotKey        KP4,LSHIFT|LAMIGA,LSHIFT|LAMIGA,W_TO_LEFT
  1939. HK4        HotKey        KP6,LSHIFT|LAMIGA,LSHIFT|LAMIGA,W_TO_RIGHT
  1940. HK5        HotKey        KP7,LSHIFT|LAMIGA,LSHIFT|LAMIGA,W_TO_LEFT_TOP
  1941. HK6        HotKey        KP1,LSHIFT|LAMIGA,LSHIFT|LAMIGA,W_TO_LEFT_BOTTOM
  1942. HK7        HotKey        KP9,LSHIFT|LAMIGA,LSHIFT|LAMIGA,W_TO_RIGHT_TOP
  1943. HK8        HotKey        KP3,LSHIFT|LAMIGA,LSHIFT|LAMIGA,W_TO_RIGHT_BOTTOM
  1944. HK9        HotKey        KP5,LSHIFT|LAMIGA,LSHIFT|LAMIGA,W_TO_CENTER
  1945. HK10        HotKey        DOWNARROW,LSHIFT|LAMIGA,SHIFT|AMIGA,W_TO_FRONT
  1946. HK11        HotKey        UPARROW,LSHIFT|LAMIGA,SHIFT|AMIGA,W_TO_BACK
  1947. HK12        HotKey        DOWNARROW,LAMIGA,SHIFT|AMIGA,BACK_W_TO_FRONT
  1948. HK13        HotKey        UPARROW,LAMIGA,SHIFT|AMIGA,FRONT_W_TO_BACK
  1949. HK14        HotKey        LEFTARROW,LSHIFT|LAMIGA,LSHIFT|LAMIGA,ACTIVATE_PREV_W
  1950. HK15        HotKey        RIGHTARROW,LSHIFT|LAMIGA,LSHIFT|LAMIGA,ACTIVATE_NEXT_W
  1951. HK16        HotKey        F1,LSHIFT|LAMIGA,LSHIFT|LAMIGA,MINIMIZE_W
  1952. HK17        HotKey        F2,LSHIFT|LAMIGA,LSHIFT|LAMIGA,MAXIMIZE_W
  1953. HK18        HotKey        TAB,LSHIFT|LAMIGA,LSHIFT|LAMIGA,REFRESH_W
  1954. HK19        HotKey        DOWNARROW,RSHIFT|RAMIGA,SHIFT|AMIGA,BACK_S_TO_FRONT
  1955. HK20        HotKey        UPARROW,RSHIFT|RAMIGA,SHIFT|AMIGA,FRONT_S_TO_BACK
  1956. HK21        HotKey        F9,RSHIFT|RAMIGA,RSHIFT|RAMIGA,SUB_BITPLANE
  1957. HK22        HotKey        F10,RSHIFT|RAMIGA,RSHIFT|RAMIGA,ADD_BITPLANE
  1958. HK23        HotKey        BACKSPACE,LAMIGA|RAMIGA,LAMIGA|RAMIGA,TOGGLE_INPUTLOCK
  1959. HK24        HotKey        DEL,LAMIGA|RAMIGA,LAMIGA|RAMIGA,TOGGLE_FASTMOUSE
  1960. HK25        HotKey        HELP,LAMIGA|RAMIGA,LAMIGA|RAMIGA,TOGGLE_SUNMOUSE
  1961.  
  1962. * Image data in CHIP-RAM
  1963.         SECTION        IMAGEDATA,DATA_C
  1964. Mask        dc.w        %0011001100110011
  1965.         dc.w        %1100110011001100
  1966.         dc.w        %0011001100110011
  1967.         dc.w        %1100110011001100
  1968.  
  1969. UArrowData    dc.w        %0000000110000000
  1970.         dc.w        %0000011111100000
  1971.         dc.w        %0001111111111000
  1972.         dc.w        %0111111111111110
  1973.         dc.w        %0000011111100000
  1974.         dc.w        %0000011111100000
  1975.         dc.w        %0000011111100000
  1976.         dc.w        %0000011111100000
  1977. DArrowData    dc.w        %0000011111100000
  1978.         dc.w        %0000011111100000
  1979.         dc.w        %0000011111100000
  1980.         dc.w        %0000011111100000
  1981.         dc.w        %0111111111111110
  1982.         dc.w        %0001111111111000
  1983.         dc.w        %0000011111100000
  1984.         dc.w        %0000000110000000
  1985. LArrowData    dc.w        %0000001100000000
  1986.         dc.w        %0000111100000000
  1987.         dc.w        %0011111111111111
  1988.         dc.w        %1111111111111111
  1989.         dc.w        %0011111111111111
  1990.         dc.w        %0000111100000000
  1991.         dc.w        %0000001100000000
  1992. RArrowData    dc.w        %0000000011000000
  1993.         dc.w        %0000000011110000
  1994.         dc.w        %1111111111111100
  1995.         dc.w        %1111111111111111
  1996.         dc.w        %1111111111111100
  1997.         dc.w        %0000000011110000
  1998.         dc.w        %0000000011000000
  1999. LUArrowData    dc.w        %1111111111110000
  2000.         dc.w        %1111111111000000
  2001.         dc.w        %1111111111000000
  2002.         dc.w        %1111111111110000
  2003.         dc.w        %1111111111111100
  2004.         dc.w        %1100001111110000
  2005.         dc.w        %0000000011000000
  2006. LDArrowData    dc.w        %0000000011000000
  2007.         dc.w        %1100001111110000
  2008.         dc.w        %1111111111111100
  2009.         dc.w        %1111111111110000
  2010.         dc.w        %1111111111000000
  2011.         dc.w        %1111111111000000
  2012.         dc.w        %1111111111110000
  2013. RUArrowData    dc.w        %0000111111111111
  2014.         dc.w        %0000001111111111
  2015.         dc.w        %0000001111111111
  2016.         dc.w        %0000111111111111
  2017.         dc.w        %0011111111111111
  2018.         dc.w        %0000111111000011
  2019.         dc.w        %0000001100000000
  2020. RDArrowData    dc.w        %0000001100000000
  2021.         dc.w        %0000111111000011
  2022.         dc.w        %0011111111111111
  2023.         dc.w        %0000111111111111
  2024.         dc.w        %0000001111111111
  2025.         dc.w        %0000001111111111
  2026.         dc.w        %0000111111111111
  2027.         END
  2028.  
  2029.